怎么在线程中定时发送或接收数据

如何在线程中定时发送或接收数据?
本帖最后由 sacxiyang123 于 2013-12-22 20:54:35 编辑
我要在工控界面中创建几个通信线程,每个线程都要定时发送或接收数据,我所创建的是用户界面线程,请问如何在用户界面线程中创建定时器?或者编写代码实现类似定时器的功能?
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:


InitInstance()
{
SetTimer(NULL,1,10000,NULL);
return true;
}


Run()
{
     MSG   msg;
while(::GetMessage(&msg,NULL,0,0))
{

switch(msg.message)
{
 case   WM_TIMER:
   {
        //工作内容

   }break;
}
}
   ExitInstance();
}

我是这么做
用WM_TIMER的消息
或者run里面sleep,用户界面线程是CWinThread的吧,直接发WM_QUIT消息就可以退出了,线程当然可以一直循环
你这样工作内容好像只能运行一次,如何让他循环执行呢?

直接就是循环了啊,SetTimer(NULL,1,10000,NULL);是每10秒会向CWinThread发一个WM_TIMER的消息。
重载run函数里面的   
    while(::GetMessage(&msg,NULL,0,0))就是消息循环,收到WM_TIMER就执行,收到WM_QUIT就会自动退出循环,否则就一直循环下去。
你看一下线程消息循环就明白了

我试了一下,不能循环啊,好像只能运行一次!

先确认一下 你用的是不是CWinThread类
你这段重载的是不是类里面的RUN函数 这个函数是重载不是自己定义加的。 


int CDownThread::Run()
{
// TODO: 在此添加专用代码和/或调用基类
MSG   msg;
//while(::PeekMessage(&msg,   NULL,   0,   0,   PM_REMOVE)   ) 
while(::GetMessage(&msg,NULL,0,0))
{

switch(msg.message)
{
 case   WM_TIMER:
   {
  
FtpDown();

   }break;
}



}
   ExitInstance();
return CWinThread::Run();
}
 

这是原模原样我可以定时运行的 CDownThread就是继承自CWinThread的,Run函数本来就是这类的成员 只是将它重载
GetMessage的返回值如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。 所以只要不受到WM_QUIT消息循环是不会退出的, 你也可以用PeekMessage试试。 还有可以用调试器追踪一下看看是怎么退出循环的,因为这个设计不接受到WM_QUIT 或者从线程外强制终止是不会只运行一次的