因为再最开始写程序的时候没有考虑到一些问题,产生了一个矛盾。 1。我从主线程中启动一个子线程,
2。子线程通过用 SendMessage() 给主线程,让主线程中的进度条和文本等界面改变。
3。但现在要求程序,让第一个线程运行完以后,才能运行后面的子线程,于是我在主线程中调用 WaitForSingleObject(),这时候矛盾就出来了,要等待第一个线程结束,那么主线程阻塞,但主线程阻塞,就不能执行子线程用 SendMessage() 发过来的消息,于是子线程也等待, 这样程序就一值阻塞下去。我试着将子线程中的 SendMessage() 改成 PostMessage(), 但这里好像 主线程的进度条访问有点问题,此方法不好,并且不能直接发应第一个线程执行的过程,最多是执行完了,改变主线程中的进度条状态一次,不和要求。还有一个方法是把主线程的进度条传进去,直接用子现存来改变状体,但这种方法,我的程序要改变很多东西,并且还有可能出现 访问冲突。 请高手指点一下,有没有什么好的解决方法?
能不能在 WaitForSingleObject(),中设定一个 timeout 时间,没隔 一断时间,我就执行一次主线程 , 但发给主线程的 消息我怎么得到呢?这种方法可行吗?
谢谢了
2。子线程通过用 SendMessage() 给主线程,让主线程中的进度条和文本等界面改变。
3。但现在要求程序,让第一个线程运行完以后,才能运行后面的子线程,于是我在主线程中调用 WaitForSingleObject(),这时候矛盾就出来了,要等待第一个线程结束,那么主线程阻塞,但主线程阻塞,就不能执行子线程用 SendMessage() 发过来的消息,于是子线程也等待, 这样程序就一值阻塞下去。我试着将子线程中的 SendMessage() 改成 PostMessage(), 但这里好像 主线程的进度条访问有点问题,此方法不好,并且不能直接发应第一个线程执行的过程,最多是执行完了,改变主线程中的进度条状态一次,不和要求。还有一个方法是把主线程的进度条传进去,直接用子现存来改变状体,但这种方法,我的程序要改变很多东西,并且还有可能出现 访问冲突。 请高手指点一下,有没有什么好的解决方法?
能不能在 WaitForSingleObject(),中设定一个 timeout 时间,没隔 一断时间,我就执行一次主线程 , 但发给主线程的 消息我怎么得到呢?这种方法可行吗?
谢谢了
解决方案 »
- 窗口创建问题上的尴尬,求大侠帮忙解惑!!
- 求真实地形数据 GTOPO_30的数据格式,即(*.DEM文件的数据格式)
- 在MFC中MEMBER VARIABLES定义一个CEDIT名称为m_spid是CSTRING类型.
- 如何判断一个字符是不是一个双字节字符的前面一半?
- 关于CObList的问题。
- 新建一个项目时有很多类型选择,区别在哪?
- 请问:如何将CListCtrl设置成行选中的格式
- 一个很菜的问题:怎样把文档类的数据传到CMainFrame
- 想学com编程,应该看什么书啊。求推荐
- 请大家说出自己的共享软件月收入注册费多少?
- 怎么将很多文件像winamp那样都放入一个列表框中?
- 关于多线程的问题(参与就有分,谢谢大家的帮助)
你不应该采用wait的方法,而是应该全部采用sendmessage的方法。在你的现成的工作过程中,
发送表示工作进度的消息。当工作完毕之后,发送工作完毕的消息。
主线程接收到两种消息分别进行处理。当接收到工作完毕的消息之后,主线程在启动第二个线程。============================================================================
提问题时要在标题中简明扼要的说明 给我发信息请附带原帖地址
http://www.betajin.com/alphasun/index.htm
http://alphasun.18en.com/ http://shakingtoolkit.9126.com/
DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
但具体使用有些问题,请再指点
至于如何启动那些suspend的线程,你可以在第一个线程中定义一个消息吗!主线程接到消息就去找这些suspend的线程得到handle,resume他们就好了。
不知道这样可以解决你的问题吗?
我写的这个程序 是一个软件升级的程序,第一个要先执行的线程是现在最新的下载程序,即使更新自己,所以要先运行,但都是下载,所以用的是一个线程函数。查了一些资料,好像 MsgWaitForMultipleObjects 这个函数 可以实现这种功能, 但不知道如何入手, 正在试验中, 请各位大虾指点指点
int exitCode;
DWORD nWaitCount=1; while(!quit){
MSG msg;
int rc; rc = MsgWaitForMultipleObjects(nWaitCount, hWaitArray, FALSE,INFINITE, QS_ALLINPUT); if(rc == WAIT_OBJECT_0 + nWaitCount)
{
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message == WM_QUIT) {
quit = TRUE;
exitCode = msg.wParam;
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else if(rc >= WAIT_OBJECT_0 && rc < WAIT_OBJECT_0 + nWaitCount)//有一个线程执行完
{
int nIndex = rc - WAIT_OBJECT_0;
break;
}
else if(rc == WAIT_TIMEOUT)//没有线程退出但超时
{ }
else if(rc >= WAIT_ABANDONED_0 && rc < WAIT_ABANDONED_0 + nWaitCount)
{
int nIndex = rc - WAIT_ABANDONED_0;
}
else
{
}
}结帖