我在程序的主线程中定义了一个变量A。然后,调用函数将变量A传递(*1)给一个子线程进行计算,计算完以后我用SendMessage/PostMessage发送消息给主线程,修改变量A的值(*2),这是一个n次循环的过程。如果用SendMessage,请问需要在(*1)处使用同步变量吗?
如果用PostMessage,请问需要在(*1)处使用同步变量吗?我认为在使用SendMessage的时候需要使用同步变量,因为此时在子线程传值时,是子线程调用对A的附值操作,可能会和主线程的附值有冲突。
而使用PostMessage时,是发一个消息到主线程的消息队列中排队,因为(*1)和(*2)的附值一定有先后顺序,所以不需要用同步变量。希望大家能够一起帮我分析一下,谢谢

解决方案 »

  1.   

    我也赞同,sendMessage要等到回复,所以最好同步,
    PostMessage可不要同步,因为发完后就不管了
      

  2.   

    主线程X,子线程Y。在(*1)处X把A传给Y后,自己在做什么?接着有对A的赋值吗?Y对A有赋值吗?计算完后发消息给X,你说的(*2)处是X修改A吧?
    如果是这样,那不管是用Send还是Post,(*1)处都不需要保护吧,而(*2)处要保护起临界区啊。
      

  3.   

    我这里(*1)(*2)是指两个动作,语句可能都是一行语句来修改变量A的值。我提问题是想搞清楚,在用SendMessage后执行对A的附值,CPU的时间片是不是还在子线程?
    如果发送一个消息后,消息放入主线程的消息队列,那么主线程对变量A的附值和子线程发送消息要求修改变量A的值都是在主线程中作的,所以就不需要做同步保护。
      

  4.   

    SendMessage需要等待结果返回
    而PostMessage不需要返回
      

  5.   

    也可以这样来描述我的问题:
    如果子线程发送一个消息到主线程,调用一个函数TDoSth2(),对于SendMessage()或PostMessage()发送消息以后,所调用的函数都是在主线程中执行的,我在函数TDoSth2()函数的第一行加入了GetCurrentThreadId()来取得先前线程的ID,对PostMessage()来说,TDoSth2是肯定在主线程的时间片中执行的。
    但是对于SendMessage(),若主线程中有一个函数调用DoSth1(),那么TDoSth2()和函数DoSth1()是不是都在主线程的时间片中执行,并且两个函数有先后的顺序?
      

  6.   

    唉,看你说的越看越糊涂,你还是贴点伪代码上来吧。搞清楚主线程做了什么,子线程做了什么,如果两个线程都要访问一个临界区/临界值,就保护一下。如果子线程发送一个消息到主线程,
    调用一个函数TDoSth2(),  --> 谁调用 ?
    对于SendMessage()或PostMessage()发送消息以后,所调用的函数都是在主线程中执行的, --> ?
    我在函数TDoSth2()函数的第一行加入了GetCurrentThreadId()来取得先前线程的ID,
    对PostMessage()来说,TDoSth2是肯定在主线程的时间片中执行的。 --> ?
    但是对于SendMessage(),若主线程中有一个函数调用DoSth1(),那么TDoSth2()和函数DoSth1()是不是都在主线程的时间片中执行,并且两个函数有先后的顺序? --> ?
      

  7.   

    我只是证明子线程发送Msg到主线程来调用函数是不是都是在主线程的的时间片中执行的,我已经用代码证明是这样的:)