最近做一个东西,要求读取8个串口的数据并解码绘图显示,同时保存在一个文件里。我在主线程里开了8个线程,分别接受8个串口的数据,累计1秒的数据就解码,想把解码后的数据传递给主线程,同时发送消息,让主线程来绘图。我在主线程里定义了公共变量m_data[Com_Index][3][512]用来存储解码后的数据,子线程不是可以访问公共变量吗?但是调试运行时总是出现AV错误。请问大虾们,像我这样的情况,子线程通过什么方法向主线程传递数据比较好呢?
谢谢大家啦!兄弟分不多,多包涵啊。

解决方案 »

  1.   

    我在主线程里定义了公共变量m_data[Com_Index][3][512]用来存储解码后的数据,子线程不是可以访问公共变量吗?
    可以,但多线程访问同一变量,要进行读写操作的话,就必须同步。你可以给主线程发自定义消息,也可以使用WM_COPYDATA
      

  2.   

    可以,如楼上的兄弟所说,必须实现同步,在同时写数据时可以使用临界区来保障操作互斥
    CRITICAL_SECTION
    InitCriticalSection
    EnterCriticalSection
    LeaveCriticalSection
    CloseHandle
    也可以使用 CCriticalSection 类,使用 Lock 和 Unlock 来控制互斥
      

  3.   

    兄弟,主线程里面定义变量是什么概念啊?不明白……应该是主线程的路径函数里面定义了变量吧?这个应该还是在函数里面,这样的话就在主线程的栈里面,其他的线程自然是不能访问的了。要不你就定义成全局的变量,这样的话,这些变量就会被放到全局存贮的区域中,这个可以给各个线程公用。但是需要进行同步,可以靠Mutex来进行。CreateMutex
    OpenMutex
    ReleaseMutex也可以使用CMutex类,使用Lock和Unlock来控制互斥。ps:空气一定很郁闷……
      

  4.   

    解决问题要考虑实际情况,你这种,我给你个建议,在主线程中定义8个内存地址,用于分别存数据。
    在定义一个定时器1秒工作一次进行数据处理。至于你用不了公共变量你去看一下createthread怎么用
    的就知道了
      

  5.   

    谢谢大家了,谢谢碧水蓝天、空气和newbiestar,到时多送点儿分。还有一个问题,定义了static的全局变量,主程序里赋值,几个子线程访问的时候会不会出问题?
    另外,想要计时,8个线程用一个CreatEvent,还是分别给每个线程开一个事件?
      

  6.   

    全局千万不要static……否则一定后悔……
      

  7.   

    全局千万不要static……
    这个有点不解,楼上的兄弟能否解释一下