用mfc创建了一个基于dialog的程序。
现在想程序一开始运行就同时启动一个新的线程。该线程中需要对主窗口中的控件进行操作。该在哪里创建线程?我的做法是在OnInitDialog中CreateThread(.....),并把主窗口的句柄传到线程入口函数中。这样做有个问题,因为OnInitDialog还没有完了,虽然有句柄,但是还没有窗口。所以在线程函数中对窗口中的控件操作时,会出现Assert(IsWindow)异常。所以我想知道,CreateThread()函数应该放在什么地方才能实现上面的效果呢。

解决方案 »

  1.   

    如果需要,可以在PreTranslateMessage函数里创建
      

  2.   

    如果是dlg程序,就在OnInitialDilog运行即可。不过不要再线程函数里面直接操作界面控件元素,这样子会有很多问题。正确的做法是线程发送消息到dlg wnd,然后dlg负责响应消息执行动作就可以了,从程序设计的角度这样子也是松耦合的对象设计,把所有应该完成的工作都在dlg界面内实现,而线程只是发送消息根据需要触发而已。供参考。
      

  3.   

    5楼说的对,尽量别在线程里操作窗口元素。
    不过你可以在OnInitDialog后添加PostMessage发送一个消息,用相应的相应函数执行下试试
    或者直接在OnInitDialog最后添加Settimer();
    OnTimer()里{创建线程;然后KillTimer();)