b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

waitforsingleobject_setevent_创建线程函数(7)

电脑杂谈  发布时间:2016-12-26 15:07:10  来源:网络整理

//}}AFX_MSG_MAP

ON_MESSAGE(WM_TEST,OnTest)

END_MESSAGE_MAP()

//用户界面线程为:

LRESULTCMyUIThread::OnTest(WPARAMwParam,LPARAMlParam)

{

//...

//处理

SetEvent((HANDLE)lParam);

return0L;

}

------Solutions------

tolovelypengpeng(鹏鹏):

现在只能认为你的消息定义机制出了问题,为你重新定义了一个用户界面线程,我的测试程序通过。还有问题吗?

------Solutions------

应该这样做,主线程要发送两个事件:1是进度事件,2是主线程结束事件。在界面线程里,应该使用MsgWaitForMultipleObjects等待两个事件,当界面线程等到进度事件时,就去刷新进度条,然后继续循环等待。当界面线程等到主线程结束事件时,界面线程退出。线程阻塞时,不能使用消息。

------Solutions------

切记切记,

向有界面的线程不要PostThreadMessage,因为,任何一个界面线程的模态消息循环都会丢掉该消息。所以要用PostMessage向主窗口发消息,并且写成

while(!PostMessge(...));的形式,保证能收到。

-----------------------

我歌月徘徊,我舞影凌乱

-----------------------

------Solutions------

TOsunbo():

能发实例一个给我吗,我怎么也通不过。

lovelypengpeng@eyou.com

------Solutions------

tolovelypengpeng(鹏鹏):

没问题,别忘了给分

------Solutions------

基本同意sunbo的看法。我想应是你的wait函数阻塞了消息循环了,把主线程的waitxxx()改为以下的代码试试:

while(1)

{

while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

if(WaitForSingleObject(m_Event,0)!=WAIT_TIMEOUT)

{

break;

}

}

------Solutions------

但是主线程和用户界面线程是运行在两个不同的线程里面的啊,

我的理解是因为它们都有自己的主窗口,所以它们都有自己的消息队列和

消息循环。在主线程里面的阻塞不应该影响到辅助线程

------Solutions------

试试这样:

m_hEvent改为g_hEvent(全局变量),

主线程为:

{

ResetEvent(g_hEvent);

WaitForSingleObject(g_hEvent,INFINITE);

}

用户界面线程为:

LRESULTOnTest(WPARAMwParam,LPARAMlParam)

{

...//处理

SetEvent(g_hEvent);

return0L;

}

------Solutions------

tolovelypengpeng(鹏鹏):

你上面的理解没错,可你的程序肯定在某处出了错。每种设计方式都有他的优缺点,要具体问题具体分析。

举个很简单的例子:如果辅线程给主线程的窗口::SendMessage(),主线程处理这个消息时程序出了问题一直没返回,辅线程的窗口不死在那儿才怪呢!也也可能由于别的同步问题会造成死锁。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23463-7.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 孙景伟
      孙景伟

      特别是常规潜艇世界第一

    热点图片
    拼命载入中...