多线程程序双核运行

海嵌 2010-03-10 09:48:31
做的一个多线程程序,一直运行正常,最近更换了一台电脑,发现出现问题。 通过日志的方式发现一个线程并没有记录写入,最后将系统单核方式工作,软件运行正常了,郁闷!

对于双核下多线程程序有体会的同仁们,希望进入讨论!

开发环境BCB6 + SP4. 运行环境Winxp+SP2
...全文
555 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
readfuture 2010-03-31
  • 打赏
  • 举报
回复
iqyely 2010-03-31
  • 打赏
  • 举报
回复
好复杂,来学习下。
ManOfBCB 2010-03-31
  • 打赏
  • 举报
回复
我的多线程做的郁闷死我了
truelove7283159 2010-03-23
  • 打赏
  • 举报
回复
提供点思路,期待结果哦.

http://topic.csdn.net/u/20090502/21/f6f34195-49a1-41f5-8795-e375aee01a22.html
http://topic.csdn.net/u/20080725/20/05307a70-29af-411d-a843-21fd849ab448.html
http://www.ibm.com/developerworks/cn/linux/l-cn-optimization/index.html
truelove7283159 2010-03-23
  • 打赏
  • 举报
回复
我觉得 大家好象没有领会LZ的意思. ---------------双核下多线程
我没多少经验哦, 隐约记得当年INTEL出多核的时候提到过这个问题.

多核的机器, 我做多线程 也没有经验.不过是不是要你在你线程工作的时候指定到哪个核.
根据你的提示,你说计算机双核就错误,该成单核就正确.

这个应该是以前单核下写的程序在多核系统下经常遇见的问题吧. 我也没经验,期待高手出现.
lengyu_984 2010-03-19
  • 打赏
  • 举报
回复
刚开始学习多线程,学习下
qiushenwei88 2010-03-16
  • 打赏
  • 举报
回复
进来学习了,帮顶
20200230 2010-03-16
  • 打赏
  • 举报
回复
值得学习,顶
Waiting4you 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 haiqian119 的回复:]

最近会改为 _beginthread, 先验证下 CreateThread, 谢谢各位同仁的参与!

静态的话最好把参数改成LPVOID,和API的要求保持一致
Waiting4you 说的意思是不是如下:
C/C++ code
void __fastcall TTMCM::OpenThreads()
{
if(hTMCM == NULL){
hTMCM = C……
[/Quote]
是的,另外给TMCM加个锁吧。
jj8113414 2010-03-11
  • 打赏
  • 举报
回复
顶你一下老海,你现在很少聊天哈
我来看看CB 2010-03-11
  • 打赏
  • 举报
回复
这个不会,帮顶。。。。。。。
海嵌 2010-03-11
  • 打赏
  • 举报
回复
bGetAllValue 几乎不变。
iPos_Axis0~~6 经常变,只不过一个线程写入,一个线程调用,所以没有加锁。
线程函数是静态 static DWORD WINAPI Thread_fun(void);

线程优先级试过 THREAD_PRIORITY_NORMAL。
Waiting4you 2010-03-11
  • 打赏
  • 举报
回复
iPos_Axis0~~6和bGetAllValue在什么情况下会改变?如果是临界点要记得加锁。
不建议直接用API的CreateThread,最好用_beginthread或_beginthreadex,这样才能保证链接多线程库。
不知道你的线程函数是静态的还是什么,CreateThread的线程函数的参数是LPVOID,不是void。
Behard 2010-03-11
  • 打赏
  • 举报
回复
从你的程序看,你的采样率大概为 90~100Hz,完全没有必要使用线程来画图的

我的建议:
1. 不要使用线程画图,而是应该发送消息给主窗口线程画图
原因:画图是很耗时间的,线程可能会停顿

2. 如果数据量大的话,可以通过发送消息的握手进行保证数据的完整性
ydlchina 2010-03-11
  • 打赏
  • 举报
回复
更改线程优先级,不要使用最低的
海嵌 2010-03-11
  • 打赏
  • 举报
回复
最近会改为 _beginthread, 先验证下 CreateThread, 谢谢各位同仁的参与!

静态的话最好把参数改成LPVOID,和API的要求保持一致
Waiting4you 说的意思是不是如下:
void __fastcall TTMCM::OpenThreads()
{
if(hTMCM == NULL){
hTMCM = CreateThread(
(LPSECURITY_ATTRIBUTES)0,
0,
(LPTHREAD_START_ROUTINE)Thread_fun,
(LPVOID)this,
CREATE_SUSPENDED,
NULL);

SetThreadPriority(hTMCM, THREAD_PRIORITY_HIGHEST);
ResumeThread(hTMCM);
}else{
ResumeThread(hTMCM);
}

if(hDraw == NULL){
hDraw = CreateThread(
(LPSECURITY_ATTRIBUTES)0,
0,
(LPTHREAD_START_ROUTINE)Thread_Darw,
(LPVOID)this,
CREATE_SUSPENDED,
&idDraw_Do);

SetThreadPriority(hDraw, THREAD_PRIORITY_LOWEST);
ResumeThread(hDraw);
}else{
ResumeThread(hDraw);
}
}
DWORD WINAPI TTMCM::Thread_fun(LPVOID lParam)
{
bool bAD_other = false;
UCHAR buf[10] = {0};
UCHAR Addr[20] = {0};

TTMCM *tmcm = (TTMCM *)lParam; //________

for( ; ;){
Sleep(10);

if(tmcm->bGetAllValue){
// AD0
SendCmd(USBhandle, USBAddr, TMCL_UF0, 0, ADC0, 0);
GetResult(USBhandle, Addr, buf, (int *)&tmcm->AD0);

// AD1
SendCmd(USBhandle, USBAddr, TMCL_UF0, 0, ADC1, 0);
GetResult(USBhandle, Addr, buf, (int *)&tmcm->AD1);

// Axis0
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor0, 0);
GetResult(USBhandle, Addr, buf, (int *)&tmcm->iPos_Axis0);

// Axis1
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor1, 0);
GetResult(USBhandle, Addr, buf, (int *)&tmcm->iPos_Axis1);

// Axis2
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor2, 0);
GetResult(USBhandle, Addr, buf, (int *)&tmcm->iPos_Axis2);

// Axis3
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor3, 0);
GetResult(USBhandle, Addr, buf, (int *)&tmcm->iPos_Axis3);

// Axis4
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor4, 0);
GetResult(USBhandle, Addr, buf, (int *)&tmcm->iPos_Axis4);

// Axis5
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor5, 0);
GetResult(USBhandle, Addr, buf, (int *)&tmcm->iPos_Axis5);

// 获取MOtor5的实际速度
SendCmd(USBhandle, USBAddr, TMCL_GAP, 3, motor5, 0);
GetResult(USBhandle, Addr, buf, (int *)&tmcm->iActual_Speed_Axis5);
}
}
}
DWORD WINAPI TTMCM::Thread_Darw(LPVOID lParam)
{
double VP1,VP2;
int iPos;
MSG msg;
int iVelocity;

TTMCM *tmcm = (TTMCM *)lParam;

//.....

}

还没有去测试,特此求证!
mabaoyes 2010-03-11
  • 打赏
  • 举报
回复
也有可能被系统缓存了.
用用fflush 函数试试.
Waiting4you 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 haiqian119 的回复:]
bGetAllValue 几乎不变。
iPos_Axis0~~6 经常变,只不过一个线程写入,一个线程调用,所以没有加锁。
线程函数是静态 static DWORD WINAPI Thread_fun(void);

线程优先级试过 THREAD_PRIORITY_NORMAL。
[/Quote]
如果iPos_Axis有一个线程写入,一个线程读出,也是要加锁的,不然会有赃数据。
静态的话最好把参数改成LPVOID,和API的要求保持一致。
海嵌 2010-03-10
  • 打赏
  • 举报
回复
void __fastcall TTMCM::OpenThreads()   // 创建线程
{
if(hTMCM == NULL){
hTMCM = CreateThread(
(LPSECURITY_ATTRIBUTES)0,
0,
(LPTHREAD_START_ROUTINE)Thread_fun,
(LPVOID)0,
CREATE_SUSPENDED,
NULL);

SetThreadPriority(hTMCM, THREAD_PRIORITY_HIGHEST);
ResumeThread(hTMCM);
}else{
ResumeThread(hTMCM);
}

if(hDraw == NULL){
hDraw = CreateThread(
(LPSECURITY_ATTRIBUTES)0,
0,
(LPTHREAD_START_ROUTINE)Thread_Darw,
(LPVOID)0,
CREATE_SUSPENDED,
&idDraw_Do);

SetThreadPriority(hDraw, THREAD_PRIORITY_LOWEST);
ResumeThread(hDraw);
}else{
ResumeThread(hDraw);
}

if(hOther == NULL){
hOther = CreateThread(
(LPSECURITY_ATTRIBUTES)0,
0,
(LPTHREAD_START_ROUTINE)Thread_Other,
(LPVOID)0,
CREATE_SUSPENDED,
&idThread_Do);

SetThreadPriority(hOther, THREAD_PRIORITY_NORMAL);
ResumeThread(hOther);
}else{
ResumeThread(hOther);
}
}
DWORD WINAPI TTMCM::Thread_fun(void) // 采集线程
{
bool bAD_other = false;
UCHAR buf[10] = {0};
UCHAR Addr[20] = {0};

for( ; ;){
Sleep(10);

if(TMCM->bGetAllValue){
// AD0
SendCmd(USBhandle, USBAddr, TMCL_UF0, 0, ADC0, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->AD0);

// AD1
SendCmd(USBhandle, USBAddr, TMCL_UF0, 0, ADC1, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->AD1);

// Axis0
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor0, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->iPos_Axis0);

// Axis1
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor1, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->iPos_Axis1);

// Axis2
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor2, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->iPos_Axis2);

// Axis3
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor3, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->iPos_Axis3);

// Axis4
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor4, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->iPos_Axis4);

// Axis5
SendCmd(USBhandle, USBAddr, TMCL_GAP, 1, motor5, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->iPos_Axis5);

// 获取MOtor5的实际速度
SendCmd(USBhandle, USBAddr, TMCL_GAP, 3, motor5, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->iActual_Speed_Axis5);

// AD2,AD3 每两次采集一次
if(bAD_other){
SendCmd(USBhandle, USBAddr, TMCL_UF0, 0, ADC2, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->AD2);

SendCmd(USBhandle, USBAddr, TMCL_UF0, 0, ADC3, 0);
GetResult(USBhandle, Addr, buf, (int *)&TMCM->AD3);
}
bAD_other = !bAD_other;
}
}
}
DWORD WINAPI TTMCM::Thread_Darw(void) // 执行线程
{
double VP1,VP2;
int iPos;
MSG msg;
int iVelocity;

for( ; ;){
Sleep(20);
if(PeekMessage(&msg,(HWND)NULL,0,0,PM_REMOVE)){
if(msg.lParam == 0){ // 初始化
TMCM->bLoad = true;
TMCM->bInit_A = true;

frm_Main->writeLog(0, "bLoad,bInit_A");

SendCmd(USBhandle, USBAddr, TMCL_SAP,4, motor3, 2000);
TMCLMoveToPosition(USBhandle, USBAddr, 0, motor3, 0);
}
}else{
if(TMCM->bLoad){
frm_Main->writeLog(msg.lParam, "------------------ SystemLoad!");
TMCM->SystemLoad();
}else{
frm_Main->writeLog(msg.lParam, "bLoad = false!");
if(TMCM->bGetAllValue){
// 绘制曲线
VP1 = TMCM->Number2V(TMCM->AD0);
VP2 = TMCM->Number2V(TMCM->AD1);
frm_Main->DrawingChart(VP1, VP2);

// motor 5 台面距离
iPos = frm_Main->GetExtendPos(TMCM->iPos_Axis5);
frm_Main->edt_Space->Text = IntToStr(iPos);

frm_Main->edt_Speed->Text = IntToStr(TMCM->iActual_Speed_Axis5);
}
}

// 火头摆动
if(TMCM->bFireMove_Start){
TMCM->FireMove(frm_Main->Range_iWay);
}
}
}
}
void __fastcall TTMCM::SystemLoad(void) // 具体执行
{
if(bInit_A){
frm_Main->writeLog(iPos_Axis3, "motor3");
if(iPos_Axis3 <= 32){
bInit_A = false;
bInit_B = true;

SendCmd(USBhandle, USBAddr, TMCL_SAP, 4, motor4, 1500);
TMCLMoveToPosition(USBhandle, USBAddr, 0, motor4, 0);
}

return;
}

if(bInit_B){
frm_Main->writeLog(iPos_Axis4, "motor4");
if(iPos_Axis4 <= 32){
bInit_B = false;
bInit_C = true;

SendCmd(USBhandle, USBAddr, TMCL_SAP, 4, motor1, 1500);
TMCLMoveToPosition(USBhandle, USBAddr, 0, motor1, 0);
}

return;
}

if(bInit_C){
frm_Main->writeLog(iPos_Axis1, "motor1");
if(iPos_Axis1 <= 32){
bInit_C = false;
bInit_D = true;

SendCmd(USBhandle, USBAddr, TMCL_SAP, 4, motor0, 1500);
TMCLMoveToPosition(USBhandle, USBAddr, 0, motor0, 0);
}

return;
}

if(bInit_D){
frm_Main->writeLog(iPos_Axis0, "motor0");
if(iPos_Axis0 <= 32){
bInit_D = false;
bInit_E = true;

SendCmd(USBhandle, USBAddr, TMCL_SAP, 4, motor2, 1500);
TMCLMoveToPosition(USBhandle, USBAddr, 0, motor2, 0);
}

return;
}

if(bInit_E){
frm_Main->writeLog(iPos_Axis2, "motor2");
if(iPos_Axis2 <= 32){

bInit_E = false;
bInit_F = true;

SendCmd(USBhandle, USBAddr, TMCL_SAP, 4, motor5, 1000);
TMCLMoveToPosition(USBhandle, USBAddr, 0, motor5, 0);
}

return;
}

if(bInit_F){
frm_Main->writeLog(iPos_Axis5, "motor5");
if(iPos_Axis5 <= 32){
bInit_F = false;
bInit_X = true;

iPos_Init = frm_Main->mm2Postion(frm_Main->fire_iAxis2);
TMCLMoveToPosition(USBhandle, USBAddr, 0, motor2, iPos_Init);
}

return;
}

//===========================================
if(bInit_X){
frm_Main->writeLog(iPos_Axis2, "motor2");
if((iPos_Init>>4) == (iPos_Axis2>>4)){
bInit_X = false;
bInit_Y = true;

iPos_Init = frm_Main->mm2Postion(frm_Main->fire_iAxis0);
TMCLMoveToPosition(USBhandle, USBAddr, 0, motor0, iPos_Init);
}

return;
}

if(bInit_Y){
frm_Main->writeLog(iPos_Axis0, "motor0");
if((iPos_Init>>4) == (iPos_Axis0>>4)){
bInit_Y = false;
bInit_Z = true;

iPos_Init = frm_Main->SetExtendPos(frm_Main->base_iWorkPos);
TMCLMoveToPosition(USBhandle, USBAddr, 0, motor5, iPos_Init);
}

return;
}

if(bInit_Z){
frm_Main->writeLog(iPos_Axis5, "motor5");
if((iPos_Init>>4) == (iPos_Axis5>>4)){
bInit_Z = false;
bLoad = false;

if(frm_Load != NULL ){
frm_Load->Close();
}
}
}
}

frm_Load 初始化时候 PostThreadMessage(idDraw_Do,WM_THREAD_Draw,0,0);
TTMCM 成员变量 iPos_Axis0~~6;
写日志函数 frm_Main->writeLog(const int N,char *msg);
日志记录如下:
bLoad = false!
bLoad = false!
bLoad = false!
bLoad = false!
bLoad = false!
bLoad,bInit_A

后面没有了,但至少应该存在 ------------------ SystemLoad! 或者 bLoad = false!
n27741 2010-03-10
  • 打赏
  • 举报
回复
不要把...没有碰到这样的问题,关注期待真相。
加载更多回复(1)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧