因为再最开始写程序的时候没有考虑到一些问题,产生了一个矛盾。 1。我从主线程中启动一个子线程,
 2。子线程通过用 SendMessage() 给主线程,让主线程中的进度条和文本等界面改变。
 3。但现在要求程序,让第一个线程运行完以后,才能运行后面的子线程,于是我在主线程中调用 WaitForSingleObject(),这时候矛盾就出来了,要等待第一个线程结束,那么主线程阻塞,但主线程阻塞,就不能执行子线程用 SendMessage() 发过来的消息,于是子线程也等待, 这样程序就一值阻塞下去。我试着将子线程中的 SendMessage() 改成 PostMessage(), 但这里好像 主线程的进度条访问有点问题,此方法不好,并且不能直接发应第一个线程执行的过程,最多是执行完了,改变主线程中的进度条状态一次,不和要求。还有一个方法是把主线程的进度条传进去,直接用子现存来改变状体,但这种方法,我的程序要改变很多东西,并且还有可能出现 访问冲突。 请高手指点一下,有没有什么好的解决方法?
能不能在 WaitForSingleObject(),中设定一个 timeout 时间,没隔 一断时间,我就执行一次主线程 , 但发给主线程的 消息我怎么得到呢?这种方法可行吗?
谢谢了

解决方案 »

  1.   

    是这样的,这个问题很好解决。
    你不应该采用wait的方法,而是应该全部采用sendmessage的方法。在你的现成的工作过程中,
    发送表示工作进度的消息。当工作完毕之后,发送工作完毕的消息。
    主线程接收到两种消息分别进行处理。当接收到工作完毕的消息之后,主线程在启动第二个线程。============================================================================
    提问题时要在标题中简明扼要的说明                    给我发信息请附带原帖地址
    http://www.betajin.com/alphasun/index.htm           
    http://alphasun.18en.com/                    http://shakingtoolkit.9126.com/
    DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
      

  2.   

    谢谢 alphapaopao(炮炮) 的指点,这种方可能不行,如果用这种方法的话,没办法确定那个线程先启动,另外我的其它子线程并不需要按顺序一个一个的执行,只是要求第一个线程,先运行完。我找到了一个函数MsgWaitForMultipleObjects
    但具体使用有些问题,请再指点
      

  3.   

    后面的子线程可以先创建,但开始就suspend,不就可以了,等第一个线程结束,再resume不就可以了。在主线程中保留那些suspend的线程的handle,到时候调用函数不就可以了,这样主线程也不停,你的其他线程不工作。
    至于如何启动那些suspend的线程,你可以在第一个线程中定义一个消息吗!主线程接到消息就去找这些suspend的线程得到handle,resume他们就好了。
      

  4.   

    就是得注意createthread第五个参数的用法,用CREATE_SUSPENDED标志。其他没什么的。到时候调用ResumeThread()函数咯。:)
    不知道这样可以解决你的问题吗?
      

  5.   

    实际上 第一个 线程 和所说的 后面的线程,是同一段代码,只是传入的参数不同而以,
    我写的这个程序 是一个软件升级的程序,第一个要先执行的线程是现在最新的下载程序,即使更新自己,所以要先运行,但都是下载,所以用的是一个线程函数。查了一些资料,好像   MsgWaitForMultipleObjects 这个函数 可以实现这种功能, 但不知道如何入手, 正在试验中, 请各位大虾指点指点
      

  6.   

    实际上现在问题的焦点就是 怎样在 一个 GUI 线程 中等待子线程结束问题。
      

  7.   

    问题解决BOOL quit = false;
    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
    {

    }

    }结帖