我的程序调用了一个第三方类库,该类库通过在工作子线程中回调函数的方式来推送一些信息给我。
我需要基于这些推送做一些界面操作,比如说create一个窗口。然后可以让用户点击某个按钮后Show出这个窗口,等等等。。
我发现在多线程的环境,操作窗口要非常小心。比如create、show要在一个线程体内,否则报错,等等等为了避免这一系列的问题,我考虑实现一种封装把第三方回调的事件,PostMessage到主线程上来。然后就是关于WPARAM、LPARAM参数的问题,我想传递一个内存块到窗口类来,但又不想让界面模块负责delete。如果开一个统一list存储参数的话,一方面要做互斥,又由于回调参数种类很多,通过抽象类,派生的话,降低了许多开发效率。所以我想求一种智能指针运用方式,实现的需求是,子线程PostMessage到主线程的参数(指向内存块的指针),不需要主线程来做释放工作。不考虑效率问题,不想做互斥工作,总之怎么简单怎么好!不知道有没有高手做过类似的处理,望指教,谢谢~~~

解决方案 »

  1.   

    简单点的话,主线程用完了之后,再PostMessage(或其他方式)回发给子线程,然后子线程delete。
      

  2.   

    PostMessage给主线程,然后主线程在PostMessage给子线程
      

  3.   


    子线程被封装在类库里啦,提供的只是一个回调,所以Post回去比较难实现了,用信号量挂起等的话也不行,不能阻塞下一个回调函数过来。
    所以最好是对象自己能控制生存周期,不需要外部关心。
      

  4.   


    子线程被封装在类库里啦,提供的只是一个回调,所以Post回去比较难实现了,用信号量挂起等的话也不行,不能阻塞下一个回调函数过来。
    所以最好是对象自己能控制生存周期,不需要外部关心。如果不能阻塞子线程的话,一般的方法就是压入list里面,然后主线程循环去取。互斥简单,回调参数就当成内存块保存就行了呀,不需要什么抽象类的。如 struct s{ char[1024];}这样压入不会丢失数据的。或者蛋疼一点的话,内存块里加个Event,主线程用完了SetEvent,子线程里再开线程,等待Event,然后释放。
      

  5.   


    子线程被封装在类库里啦,提供的只是一个回调,所以Post回去比较难实现了,用信号量挂起等的话也不行,不能阻塞下一个回调函数过来。
    所以最好是对象自己能控制生存周期,不需要外部关心。如果不能阻塞子线程的话,一般的方法就是压入list里面,然后主线程循环去取。互斥简单,回调参数就当成内存块保存就行了呀,不需要什么抽象类的。如 struct s{ char[1024];}这样压入不会丢失数据的。或者蛋疼一点的话,内存块里加个Event,主线程用完了SetEvent,子线程里再开线程,等待Event,然后释放。好吧,如果一定得强制规定调用方的行为的话,那还是就定义一个list的push(),pop(),erase()方法。 
    强制规定pop()使用完了以后,erase()吧。 和setEvent是一个概念。
    这样就是对流程有强制的规定,以后的开发、修改容易出错
      

  6.   

    求大大指条捷径,如何在50行代码内搞定这个问题!我也知道include boost库,用个智能指针+函数对象一下就搞定了。可是解决一个小小的问题,未免有些高射炮打蚊子的赶脚~~~~~
      

  7.   

    如果界面操作没什么耗时的可以考虑SendMessage,另再注意下SendMessage可能造成的死锁条件就可以了
      

  8.   

    WPARAM、LPARAM 一个传数据,一个传销毁的函数指针。