1.有个全局存在的内存对象,主线程向里面写入数据,子线程处理其中的数据并删除;这块内存的数据被两个线程公用,请问应该注意些什么问题?
2.是不是子线程因为没有窗口对象或者说它自身不是窗口对象,它没有维护消息队列,所以对线程发送消息如sendmessage(mythread.handle,wm_mymessage,0,integer(@mydata)),mythread这个线程是接收不到这个消息的,怎么样能让它接收到这个消息呢;
也就是怎么向子线程发送消息?

解决方案 »

  1.   

    >>1.有个全局存在的内存对象,主线程向里面写入数据,子线程处理其中的数据并删除;这块
    >>内存的数据被两个线程公用,请问应该注意些什么问题?
    用互斥量就可解決!
    當一個線程要操作 該變量時, 先設置互斥量, 
    再操作, 操作完, 再釋放, 另外一個, 操作前, 先檢查互斥量, 再操作!!
    這樣就比較安全!!!>>2.是不是子线程因为没有窗口对象或者说它自身不是窗口对象
    用這個吧
    BOOL PostThreadMessage(          DWORD idThread,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
    );
      

  2.   

    1。注意读写锁。参照CCriticalSection。多子线程访问用信号量CSemaphore,降低CPU空转,提高效率
       利用事件(CEvent)辅助控制同步
    2。PostThreadMessage?可用事件替换,自己循环WaitForMultiObject事件,效果一样的。
      

  3.   

    不要用CMutex互斥量。
    CMutex可以进程互斥,但效率比CCriticalSection慢
      

  4.   

    我用了这个API
    BOOL PostThreadMessage(          DWORD idThread,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
    );
    但是子线程的消息处理函数还是没有触发
      

  5.   

    如果你想
    >>子线程的消息处理函数还是没有触发
    你還必須用 PeekMessage來取!但實際中, 如果你通知的數息類型比較小, 可用
    Event配合 WaitForMultipleObjects 來實現更好, 更簡單!
      

  6.   

    线程有自己的消息队列啊 
    from win95程序设计大奥妙
    38h DWORD MessageQueue
    此欄位的低字組(low WORD)放置㆒個Win16 global heap handle,用作執行緒的訊息
    佇列。訊息佇列是存放系統轉來的視窗訊息的場所,將在第4章介紹。這個欄位和
    W16TDB 的1Ch 欄位有密切關係。
      

  7.   

    1,注意不要读写冲突2,线程不有没有消息队列,完全在于此线程是否调用过user32.dll里面的函数。