鱼C论坛

 找回密码
 立即注册
查看: 826|回复: 8

[已解决]线程函数的执行顺序控制

[复制链接]
发表于 2020-8-9 21:05:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我有三个线程函数,分别是数据读取,数据处理,数据保存。可是我在测试的时候,发现线程启动之后,每次都是先进入的数据保存线程函数,再进入到数据处理线程函数,导致每次值都是空的没有保存,这种情况下如何控制线程函数的执行顺序。新人求教。谢谢大神。
最佳答案
2020-8-10 10:07:03
本帖最后由 xieglt 于 2020-8-10 10:09 编辑

WINDOWS 的线程同步的方法很多,随便说一种吧,用Event

首先:
定义全局的 Event并初始化

//1、定义全局的Event
HANDLE  g_process = NULL;
HANDLE  g_store = NULL;

//2、主线程里对Event进行初始化
g_process = CreateEvent(NULL,FALSE,FALSE,NULL);
g_store = CreateEvent(NULL,FALSE,FALSE,NULL);

//3、数据采集线程
//采集数据
...
//数据采集完毕
//设置g_process状态,通知数据处理线程可以进行数据处理了
SetEvent(g_process);

//4、数据处理线程
//等待数据处理信号(g_process)

//无限等待,等待到信号则线程继续,你这样的处理逻辑无限等待就可以了
WaitForSingleObject(g_process,INFINITE);
//数据处理
...
//数据处理完毕
//设置数据存储信号
SetEvent(g_store);

//5、数据存储线程
//无限等待,等待到信号则线程继续
WaitForSingleObject(g_store,INFINITE);

//数据存储
...
//数据存储完毕

//6、主线程里释放 Event对象

CloseHandle(g_process);
CloseHandle(g_store);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 21:18:03 | 显示全部楼层
可能是在主函数里这三个函数的顺序是保存,处理,读取。而不是读取,处理,保存
不过这只是猜测,放一下代码吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-9 21:32:53 | 显示全部楼层
巴巴鲁 发表于 2020-8-9 21:18
可能是在主函数里这三个函数的顺序是保存,处理,读取。而不是读取,处理,保存
不过这只是猜测,放一下代 ...

                                pGetDataThread_L = AfxBeginThread(ThreadGetDataLeft, &m_2DThreadParam_L);//开启采集线程
                                pDealThread_L = AfxBeginThread(ThreadDealLeft, &m_2DThreadParam_L);     //开启处理线程
                                pStDataThread_L = AfxBeginThread(ThreadStData_L, &m_2DThreadParam_L);   //数据保存线程的调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-10 10:02:54 | 显示全部楼层
内裤里有糖吃 发表于 2020-8-9 21:32
pGetDataThread_L = AfxBeginThread(ThreadGetDataLeft, &m_2DThreadParam_L);//开启采集线程
                                p ...

完整程序太大啦,而且不太方便,调用是按采集,处理,存储的顺序调用的。求指点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 10:07:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-8-10 10:09 编辑

WINDOWS 的线程同步的方法很多,随便说一种吧,用Event

首先:
定义全局的 Event并初始化

//1、定义全局的Event
HANDLE  g_process = NULL;
HANDLE  g_store = NULL;

//2、主线程里对Event进行初始化
g_process = CreateEvent(NULL,FALSE,FALSE,NULL);
g_store = CreateEvent(NULL,FALSE,FALSE,NULL);

//3、数据采集线程
//采集数据
...
//数据采集完毕
//设置g_process状态,通知数据处理线程可以进行数据处理了
SetEvent(g_process);

//4、数据处理线程
//等待数据处理信号(g_process)

//无限等待,等待到信号则线程继续,你这样的处理逻辑无限等待就可以了
WaitForSingleObject(g_process,INFINITE);
//数据处理
...
//数据处理完毕
//设置数据存储信号
SetEvent(g_store);

//5、数据存储线程
//无限等待,等待到信号则线程继续
WaitForSingleObject(g_store,INFINITE);

//数据存储
...
//数据存储完毕

//6、主线程里释放 Event对象

CloseHandle(g_process);
CloseHandle(g_store);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 10:53:06 | 显示全部楼层
多线程我也不太懂
你可以看看这个:https://www.jianshu.com/p/481c01528bdb
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-10 11:18:33 | 显示全部楼层
巴巴鲁 发表于 2020-8-10 10:53
多线程我也不太懂
你可以看看这个:https://www.jianshu.com/p/481c01528bdb

我查到过,这是jave的吧。0.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-10 15:34:10 | 显示全部楼层
本帖最后由 内裤里有糖吃 于 2020-8-10 15:45 编辑
xieglt 发表于 2020-8-10 10:07
WINDOWS 的线程同步的方法很多,随便说一种吧,用Event

首先:


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-10 15:35:43 | 显示全部楼层
本帖最后由 内裤里有糖吃 于 2020-8-10 15:45 编辑
内裤里有糖吃 发表于 2020-8-10 15:34
我还想请问个问题,因为经常性的设备读取的数值不对,所以我在读取线程函数里面放了一个while语句,只有 ...


是我程序写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 07:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表