我想实现这样一个功能不知道vc里面有没有,或者说怎么在vc里面实现.我有一个事件(或者说一个信号,flag等)改变或者激发, 我希望其他进程,进程里面的一个线程,或者进程中的多个、全部线程都可以响应这个事件。 但是我事件激发的地方,并不知道有多少个进程或者线程和自己关联,也许一个都没有,并且我这些线程、进程都没有窗口。

解决方案 »

  1.   

    在Windows下你可以使用CreateEvent来创建一个事件。如果你为这个事件指定名字,那么如果操作系统中没有同样名字事件的话,会创建一个有名字的事件,否则会返回一个现存事件的句柄。你也可以用OpenEvent来访问一个现存的事件。关于事件的触发和响应,参考Using Event Objects
      

  2.   

    事件应该是进程内有效的,其它进程访问不到,应该使用互斥对象。
    CreateMutex
      

  3.   

    用互斥量或者信号量。
    如果使用互斥量,主进程创建互斥量时同时拥有,当需要激发信号时释放互斥量。其它进程的线程应该不停使用WaitFor...函数去测试能否得到互斥量,如果得到了就响应事件,然后释放让别的进程线程有机会响应事件。
    如果使用信号量,主进程创建信号量时指定初始计数等于最大计数(比如都是30),当需要激发信号时释放信号量(ReleaseSemaphore(handle,30,NULL)),其它进程使用WaitFor...尝试获得该信号量,然后响应事件,最多可以让30个线程同时响应。
      

  4.   

    我回答你吧 jameshooo :互斥量我考虑过了,和event差不多。
    1. 不过你说激发的时候释放互斥量,我不想那么做,我可以在别的线程、进程去open这个互斥量的,打开就是有互斥量。 
    2. 信号量我没考虑根据你的提示,需要知道有多少个数目,我再激发的时候根本不知道有多少关联存在,也许0,10,100,这些关联也不会和我主动通信。
        (类似你关机的时候,系统会和你机器上的所有顶层窗口发一个WM_close消息,各个窗口在接到这个消息以后再进行自己的处理,这个只是举例,不探讨这个消息,那你可以把这个消息看成是我题目中的事件、标志位)。
    3.  event 是个handle别的程序的确可以使用openevent来打开这个event,这个方法也和我当初设想的差不多。