按顺序发送A,B,C,D这四条指令,算这件事完成了一遍(只能依次发送ABCD)。现在要完成这件事10遍 线程X,发送A,C。线程Y,发送B,D。但A发送完后,过180秒才能发送B,在这180秒内线程X可以发送A,不能sleep。 UINT CProcess::X_thread(LPVOID p)
{
//线程X发送完指令A后:
Xdlg->SetTimer(1,180000,NULL); //180s
} void CProcess::OnTimer(UINT nIDEvent)
{
//向线程Y发送消息
CProcess *p;
::PostMessage((HWND)p, TIMEOUT, 0, 0); //参数1对吗?
} UINT CProcess::Y_thread(LPVOID p) //机械手的运动的线程
{
MSG msg; //线程的消息
if(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
switch(msg.message)
{
case TIMEOUT:
TimeOut=TRUE;
break;
default: break;
}
}
if(TimeOut==TRUE )
//发送消息B }
1 这段代码,实现了上述功能吗?
2 OnTimer(UINT nIDEvent) 函数应该写什么代码?
3 KillTimer(1);这句代码应该写在那个函数里? 4 有什么函数的功能是:从这点计时,过180秒,通知时间到?
不对
CProcess *p;线程和句柄没关系啊
逻辑和使用都有问题1。这段代码,实现了上述功能吗?
没有实现,代码写错了,另外你用了SetTimer的中断技术,不用多线程也能达到效果的2. OnTimer(UINT nIDEvent) 函数应该写什么代码?
这里的nIDEvent就是你SetTimer的第一个参数,也就是说
如果你SetTimer(1,180000,NULL);
你在OnTimer(UINT nIDEvent)
{
if(1==nIDEvent)
{
就会进来 因此可以说不用多线程也能达到目的
进来以后就可以KillTimer(1)了
}
}3.参考2有解释
4.SetTimer就是你要的这个功能
循环+Sleep(毫秒);
(S大写)
只是实现原理不同,实现同样的效果,不同的方式而已,何必计较。现在计算机效率那么高,多开线程没问题的。如果消息处理有问题或是什么问题,导致处理不到WM_TIMER多麻烦,还不如用线程可靠。
{
DWORD timeStart,timeStop=0;
timeStart = GetTickCount();
while((timeStop - timeStat) != iElapsed*1000)
{
timeStop = GetTickTime();
}
PostMessage(XXX);
}
不能用sleep,还有其它的方法吗?
================
CreateWaitableTimer -》SetWaitableTimer -》WaitForSingleObject
to agoago_2009: 你能给出大概的例子或一段code吗?谢谢
to agoago_2009:
用"CreateWaitableTimer -》SetWaitableTimer -》WaitForSingleObject"这个办法, 在这180秒,一直等待信号,F5禁止
可我需要在这180秒,发前面的指令,我需要重复做这件事, 有没有什么办法?