小弟基于MFC编了一个多线程同步的测试程序,创建了2个子线程thread1和thread2分别进行对资源进行操作。现在需要把各个子线程操作的结果实时的显示在主线程界面的一个listbox控件上,我自己是用子线程给主线程发自定义消息的方法来做的,把主线程的窗口句柄传给这两个子线程,然后让线程需要更新数据时向界面窗口发消息,在消息处理中对界面进行更新,但是总是报错,说是内存不能为read,貌似遇到内存访问冲突的问题了,求大神们指条明路

解决方案 »

  1.   

    多线程访问同一资源要考虑线程同步的问题,同步的方式有很多种,你自己可以选择,或者两个子线程都PostThreadMessage到主线程,由主线程响应对应消息就OK了。
      

  2.   

    1楼的大神,小弟是用事件对象做的同步,也就是说create一个event然后判断这个event的状态来做的,用得sendmessage来发送的消息,不知道PostThreadMessage怎么用?能否给个demo
      

  3.   

    一个窗口处理消息的顺序是先来先处理。
    使用SendMessage,首先会阻塞调用SendMessage的线程,其次,处理消息的窗口子过程被调用。直到调用完成,窗口才能继续处理后来的消息,同时SendMessage才会返回。
    其次,事件同步用使用到SetEvent以及重置等操作,得理清和协调好,不然很容易出错。
      

  4.   

    postthreadmessage的用法跟sendmessage差不多,只不过postthreadmessage是发送到线程,在从CWinapp(其父类是cwinthread)派生的类中添加消息响应,采用ON_THREAD_MESSAGE映射,个人觉得貌似没必要用这个,可以直接发消息到窗口..内存不能READ看下sendmessage的句柄是否有效,如果线程内的数据处理没有访问到公共资源,仅仅是2个线程都给UI发了更新数据的消息(都在UI部分处理),不加线程同步貌似也是可以的,不对之处请楼下指正
      

  5.   

    SendMessage就可以了,用SendMessage都不需要加event来同步。
    SendMessage发消息给UI线程,并等待处理才能返回,同一时间UI线程只可能处理一个消息。
    应该是什么地方内存读写出错了。
      

  6.   

    确定下异常断点在哪里?是sendmessage那句?
      

  7.   

    debug运行程序,报错后点“重试”,根据call stack窗口定位错误代码行,分析。
      

  8.   

    Debug下看call stack函数调用堆栈
      

  9.   

    首先MFC界面控件不是多线程安全的,使用sendmessage,post都不能保证,
    就是在你自定义相应的函数添加临界区保护。
      

  10.   

    感谢楼上各位大神,已经用别的方法了~感觉MFC中多线程很不靠谱~