| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 573 人关注过本帖
标题:求助!: 关于线程中数据传出的问题
只看楼主 加入收藏
toby_peng
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-6-18
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
求助!: 关于线程中数据传出的问题
我的程序是个SDI应用,全部工作都在一个视(view)里完成。在这个视里定义了一个数组:UINT result[5900],在视的某个函数里启动一个线程进行数据采集,并将采集到的数据存放于result[5900]中。相关代码如下:

在view.h中除了那个UINT result[5900]外,还定义:

typedef struct{

    UINT    AD[5900];
    HANDLE  hUsb;
    UINT    flag_samplemode;
    UINT    code;

} THREAD_INFO;


CWinThread *m_pThread;
THREAD_INFO m_ThreadInfo;


启动线程:
DoSample()
{
   ...
   m_pThread = AfxBeginThread(ThreadProc,& m_ThreadInfo);
   ...
   for (i=0;i<5900;i++) result[i]=m_ThreadInfo.AD[i];
}

运行后碰到的问题是: 无论是result,还是m_ThreadInfo.AD中,数据均为空,根本没有从线程中传出来,但在线程ThreadProc中是有数据的。

我原来以为这个程序很简单,不需要用到同步,可问题究竟出在哪里?请各位高手指点,谢谢!

搜索更多相关主题的帖子: 数据 线程 
2010-06-18 09:10
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:10 
至少要等线程运行完成了,才会有数据吧!你可以在线程完成时,给你主线程发一个消息,在消息处理中处理数据。

★★★★★为人民服务★★★★★
2010-06-19 15:57
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:10 
楼上说的很对。
出现这个问题主要原因是你在
m_pThread = AfxBeginThread(ThreadProc,& m_ThreadInfo);
之后马上就去取数据,这时候所启的线程可能还没有真正启动,也可能启动了但还没有对数据容器做处理,不管怎么样,这时候就去拿数据是为时过早了。
你可以把两个线程看成两个人,楼上的做法是副线程在处理完数据后,通知主线程:我处理完数据了,你可以来做你的处理了。简单的做法就是利用WINDOWS消息机制来做,把完成后消息做成一个命令通知到一个特定控件上去。也可以自己做一个消息泵来处理事件。
还有一种方式是轮询机制,就象是主线程每过一段时间就去询问一次:副线程我给你的事儿做完没有,这个在早期的DOS程序里用的比较多,其实就是使用一个共用的变量,未完成值为0,完成了副线程就把它设置为1,主线程上在主循环中总上去查这个变量,当它变为1后,处理数据。
2010-06-20 13:57
toby_peng
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-6-18
收藏
得分:0 
谢谢楼上两位的帮助,特别是debroa723!
2010-06-21 15:24
快速回复:求助!: 关于线程中数据传出的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016424 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved