程序中有好几个线程,其中有一个线程负责统计数据向屏幕输出,我希望在这个线程一起动,它自己就能每隔1秒统计数据向屏幕输出,而不是由调用它的父线程每隔一秒就调用它。
该如何作呢,请大侠们给点思路。
谢谢!

解决方案 »

  1.   

    用一个循环就可以了
    在循环中加一句
    Sleep(1000);这个语句能有让一个线程停止调度一定的时间,这里是1秒
      

  2.   

    要用::SetTimer就需要有窗口,利用WM_TIMER就可以
    否则就在你的计算程序中的某个地方不断读取时间,比较累计到一秒就传输局
    不过计算量太大时会影响速度,
    如果不要求精确,可用这样的方式:
    if( !(++nCount - nMaxNum) )
    {
    nCount = 0;
    ///
    //输出你的数据
    ........
    ........
    ///
    }
    把nMaxNum取一个相当巨大的数
      

  3.   

    用windows api SetTimer()
    其中的参数分别为时间间隔、回调函数指针,时钟标识。
    你自己必须实现你的回调函数,你要桌的事情在回调函数中完成。
      

  4.   

    用windows api SetTimer()
    其中的参数分别为时间间隔、回调函数指针,时钟标识。
    你自己必须实现你的回调函数,你要桌的事情在回调函数中完成。
      

  5.   

    其实还不如用Sleep。反正这个线程又没有其他的事情要做。
      

  6.   

    to:  newbackup (天空)  
    有一个线程负责统计数据向屏幕输出这个线程统计数据的任务重不重啊,如果只是输出,倒是用Sleep最好
      

  7.   

    NowCan(能量、激情、雨水、彩虹——雷雨云) :不用Sleep行吗?如果死循环,从性能监视器上看,Cpu 使用率太高!其他程序会受影响。
      

  8.   

    to  netsbull(网牛) 
    这个线程统计数据的任务重不重啊,如果只是输出,倒是用Sleep最好重到不重,不过我要求一秒钟它就能负责统计数据一次,但每次统计所需的时间不同,所以用Sleep的话,不好指定Sleep()的参数。
    大家有什么好方法吗?
    像定时器样,到了一秒钟它就自动统计一次。
    谢谢!
      

  9.   

    用settimer吧
    不需要窗口句柄的,具体查一下msdn就可以知道如何设置没有窗口句柄的定时器了
    同时设计一个全局事件,用事件机制启动线程(即一秒定时到),和阻塞线程(做完线程中的工作后,而时间也没有到),
    线程可以用死循环
      

  10.   

    我觉得还是要用settimer,用sleep不好
      

  11.   

    //////////////////////////////////////////////////////////////
    user timer in workthread of console app
    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    unsigned long WINAPI Thread(PVOID pvoid);
    void main()
    {
    DWORD dwThreadId;
    printf("use timer in workthread of console application<masterz>\n");
        HANDLE hThread = CreateThread( 
            NULL,                        // no security attributes 
            0,                           // use default stack size  
            Thread,                  // thread function 
            0,                // argument to thread function 
            0,                           // use default creation flags 
            &dwThreadId); 
    DWORD dwwait=WaitForSingleObject(hThread,1000*30);
    switch(dwwait)
    {
    case WAIT_ABANDONED:
    printf("main thread WaitForSingleObject return WAIT_ABANDONED\n");
    break;
    case WAIT_OBJECT_0:
    printf("main thread WaitForSingleObject return WAIT_OBJECT_0\n");
    break;
    case WAIT_TIMEOUT:
    printf("main thread WaitForSingleObject return WAIT_TIMEOUT\n");
    break;
    }
    CloseHandle(hThread);
    _getch();
    }unsigned long WINAPI Thread(PVOID pvoid)
    {
     MSG msg;
         PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
     UINT timerid=SetTimer(NULL,111,3000,NULL);
         BOOL bRet;
    int count =0;
    while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)

    if (bRet == -1)
    {
    // handle the error and possibly exit
    }
    else
    if(msg.message==WM_TIMER)
    {
    count++;
    printf("WM_TIMER in work thread count=%d\n",count);
    if(count>4)
    break;
    }
    else
    {
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    }
    }
    KillTimer(NULL,timerid);
    printf("thread end here\n");
    return 0;
    }