社区
进程/线程/DLL
帖子详情
MFC,线程调用函数
qq_37834095
2018-06-20 02:34:52
我在想点击开始按钮然后就运行我的一个自定义函数保证界面不卡死。
.h头文件声明 自定义函数:void Denmic(long a long b);
.cpp文件的按钮响应消息里面,创建了一个线程AfxBeginThread(timef,this);
也给出了线程函数
UINT timef (LPVOID aParm)
{
return 0;
}
问题是我怎么调用自定义函数,并且我的界面不会卡死.
...全文
2189
236
打赏
收藏
MFC,线程调用函数
我在想点击开始按钮然后就运行我的一个自定义函数保证界面不卡死。 .h头文件声明 自定义函数:void Denmic(long a long b); .cpp文件的按钮响应消息里面,创建了一个线程AfxBeginThread(timef,this); 也给出了线程函数 UINT timef (LPVOID aParm) { return 0; } 问题是我怎么调用自定义函数,并且我的界面不会卡死.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
236 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
schlafenhamster
2018-07-07
打赏
举报
回复
for(short i=0;i<p_inx; i++)//这里的i可以累加了
{
if(i==0) 这条语句 只含 下一句
afxDump<<i<<"=i\n"; // if 到这里 结束 !!!
afxDump<<p_inx<<"=p_inx\n";//是这样改的
{ // 这个 大 括号 与 if (i==0)无关 !!!!
long a=Jspace[i].a;
******
}
qq_37834095
2018-07-07
打赏
举报
回复
小弟在此感谢各位师傅、同仁的帮助!谢谢大家!
qq_37834095
2018-07-03
打赏
举报
回复
可以啊,有联系方式吗
qq_37834095
2018-07-03
打赏
举报
回复
这时候else下的光标是一行一行走的
qq_37834095
2018-07-03
打赏
举报
回复
UNIT timmef1(LPVOID aparm)
{
for(short i=0;i<p_inx; i++)//这里的i可以累加了
{
if(i==0)
afxDump<<i<<"=i\n";
afxDump<<p_inx<<"=p_inx\n";
//是这样改的
{
long a=Jspace[i].a;
******
}
else
{
long tm_a,tm_b,tm_c;
}
qq_37834095
2018-07-03
打赏
举报
回复
就是这个情况,我不能带0做参数的呀,几个都是这样
schlafenhamster
2018-07-03
打赏
举报
回复
if(i==0)
afxDump<<i<<"=i\n";// if end !!!!
afxDump<<p_inx<<"=p_inx\n";
{
改
afxDump<<i<<"=i\n";
afxDump<<p_inx<<"=p_inx\n";
if(i==0)
{
qq_37834095
2018-07-03
打赏
举报
回复
光标到else下面就直接跑到return 0;这里了
qq_37834095
2018-07-03
打赏
举报
回复
for(short i=0;i<Pinx;i++)// 共 pinx 个 线程 !!!
{
if(i==0)
{
AfxBeginThread(timef1,this);
}
else
{
AfxBeginThread(timef2,this);
}
}
我一直把Pinx当做次数的!那不用这个方法了!
UNIT timmef1(LPVOID aparm)
{
long tm_a,tm_b,tm_c;
for(short i=0;i<p_inx; i++)//这里的i可以累加了
{
if(i==0)
afxDump<<i<<"=i\n";
afxDump<<p_inx<<"=p_inx\n";
{
long a=Jspace[i].a;
******
*****
Denmic( a ,b,c,tf0);
}
else
{
tm_a=(long)Jspace[i].a-(long)Jspace[i- 1].a;
//这里2个变量值做减法,明明有值的,为什么tm_a=0呢?
tm_b=(long)Jspace[i].a-(long)Jspace[i- 1].b;
tm_c=(long)Jspace[i].a-(long)Jspace[i- 1].c;
Denmic(tm_a,tm_b,tm_c,(long)Jspace[i].c,(long)Jspace[i].l_time);
}
if(g_EndThread) break;
}
return 0;
}
schlafenhamster
2018-07-03
打赏
举报
回复
for(short i=0;i<Pinx;i++)// 共 pinx 个 线程 !!!
{
if(i==0)
{
AfxBeginThread(timef1,this);
}
else
{
AfxBeginThread(timef2,this);
}
}
怎么说不明白 ?
qq_37834095
2018-07-03
打赏
举报
回复
上面肯定用for啊。如果不能用2个线程函数处理,就这样啊
UNIT timmef1(LPVOID aparm)
{
long tm_a,tm_b,tm_c;
for(short i=0;i<p_inx; i++)//这里的i不累加是线程调用的Denmic函数在死循环…………
{
if(i==0)
afxDump<<i<<"=i\n";
afxDump<<p_inx<<"=p_inx\n";
{
Denmic( (long)Jspace[i].a ,(long)Jspace[i].b,(long)Jspace[i].c,(long)Jspace[i].l_time);
}
else
{
tm_a=(long)Jspace[i].a-(long)Jspace[i- 1].a;
tm_b=(long)Jspace[i].a-(long)Jspace[i- 1].b;
tm_c=(long)Jspace[i].a-(long)Jspace[i- 1].c;
Denmic(tm_a,tm_b,tm_c,(long)Jspace[i].c,(long)Jspace[i].l_time);
}
if(g_EndThread) break;
}
return 0;
}
逻辑就是要分2种情况的。
schlafenhamster
2018-07-02
打赏
举报
回复
"就一个线程啊"
if
(short i=0;i<Pinx;i++)
如果是 if ,这句 语法错
如果是 for ,那么 创建了 Pinx 个 线程!
仔细 想想 你 的 程序 逻辑,
qq_37834095
2018-07-02
打赏
举报
回复
恩,就一个线程啊
qq_37834095
2018-07-01
打赏
举报
回复
还有这个方案
void xxDlg::OnButtonStart()//启动按钮
{
if(short i=0;i<Pinx;i++)
//这里的i是全局的
{
if(i==0)
{
AfxBeginThread(timef1,this);
}
else
{
AfxBeginThread(timef2,this);
}
}
}
这样表达可以吗?但是这样的话一直会报内存泄露,用 OnDestory()也没有效果……
qq_37834095
2018-07-01
打赏
举报
回复
把 if (space_x>0&&space_y>0&&space_z>0)
都 注释 掉, 只要 count++ …………这样的话count一直加的和i不匹配啊,这样没意义啊!
UNIT timmef1(LPVOID aparm)
{
long tm_a,tm_b,tm_c;
for(short i=0;i<p_inx; i++)
//这里的i不累加是线程调用的Denmic函数在死循环…………
{
if(i==0)
afxDump<<i<<"=i\n";
afxDump<<p_inx<<"=p_inx\n";
{
Denmic( (long)Jspace[i].a ,(long)Jspace[i].b,(long)Jspace[i].c,(long)Jspace[i].l_time);
}
else
{
tm_a=(long)Jspace[i].a-(long)Jspace[i- 1].a;
tm_b=(long)Jspace[i].a-(long)Jspace[i- 1].b;
tm_c=(long)Jspace[i].a-(long)Jspace[i- 1].c;
Denmic(tm_a,tm_b,tm_c,(long)Jspace[i].c,(long)Jspace[i].l_time);
}
if(g_EndThread) break;
}
return 0;
}
我是想当保存一个数据的时候就调用if(i==0)里面的函数,当保存多个数据的时候就调用else里面的函数啊,并且else里面的数据是做完一次累加一次一直到i等于最大值结束。else里面的函数把参数改下就可以了,如何让count和i匹配起来啊,有什么办法吗
schlafenhamster
2018-07-01
打赏
举报
回复
不 可以, 请 学习 基本 知识 !
else
{
AfxBeginThread(timef2,this);
}
创建了 多少 线程 !
schlafenhamster
2018-06-29
打赏
举报
回复
"while(!g_EndThread)//这里的while一定要有的,这是一个
工作模式
"
应该是
UNIT timmef1(LPVOID aparm)
{
"while(!g_EndThread)
{
。。。。。。。。。。。。。。。。。。
}
吧?
i =0 时 Denmic () 因为 while 而在 Denmic() 内 死循环, 当然 i没法 i++ !
什么叫 “工作模式”??
qq_37834095
2018-06-29
打赏
举报
回复
UNIT timmef1(LPVOID aparm)
{
long tm_a,tm_b,tm_c;
for(short i=0;i<p_inx; i++)//
这里的i为什么不循环累加呢?
{
if(i==0)
afxDump<<i<<"=i\n";
afxDump<<p_inx<<"=p_inx\n";
{
Denmic( (long)Jspace[i].a ,(long)Jspace[i].b,(long)Jspace[i].c,(long)Jspace[i].l_time);
}
else
{
tm_a=(long)Jspace[i].a-(long)Jspace[i- 1].a;
tm_b=(long)Jspace[i].a-(long)Jspace[i- 1].b;
tm_c=(long)Jspace[i].a-(long)Jspace[i- 1].c;
Denmic(tm_a,tm_b,tm_c,(long)Jspace[i].c,(long)Jspace[i].l_time);
}
if(g_EndThread) break;
}
return 0;
}
//----------------------------------------------------------------------
Denmic(long a,long b,long c,long t0)
{
long count =0;
double os[3];tim=0,t0;
double rfos_x,rfos_y,rfos_z;
short space_x,space_y,space_z;
while(!g_EndThread)
//这里的while一定要有的,这是一个工作模式
{
if (space_x>0&&space_y>0&&space_z>0)
{
if(time<t0)
{
T+=6;
os[0]=a*T*T/(t0*t0);
os[1]=b*T*T/(t0*t0);
os[2]=c*T*T/(t0*t0);
for(short i=1;i<=3;i++)
{
te(i,os[3-i]);
}
}
if(time==t0)
{
Stop(a,tf);
Stop(b,tf);
Stop(c,tf);
}
}
else if ((space_x==0)&&(space_y==0)&&(space_z==0))
{
Start(x);
Start(y);
Start(z);
}
count++;
if(g_EndThread) break;//----------------
}
}
void xxDlg::OnButtonStart()//启动按钮
{
AfxBeginThread(timef1,this);
}
schlafenhamster
2018-06-29
打赏
举报
回复
把 if (space_x>0&&space_y>0&&space_z>0)
都 注释 掉, 只要 count++
看 加不加 !
qq_37834095
2018-06-29
打赏
举报
回复
关键是count没有累加
加载更多回复(212)
MFC
单文档应用程序子
线程
向主
线程
发送消息
调用函数
本文介绍如何在
MFC
应用程序中实现跨
线程
的消息传递,以更新主
线程
的界面。通过在Resource.h中定义自定义消息,在View类中添加响应函数,并在子
线程
中使用PostMessage发送消息,可以安全地进行界面更新。
在
mfc
中使用
线程
局部数据tls
博客介绍了
MFC
中
线程
局部数据的相关内容。不同
线程
调用函数
时,局部变量会有新拷贝,全局和静态变量只有一份实体。
MFC
提供机制可像定义全局变量一样定义
线程
局部数据,介绍了使用宏THREAD_LOCAL定义的方法及原理,还提到CThreadLocal靠TLS记住堆上对象所属
线程
。
AfxBeginThread创建
线程
的用法
本文介绍了使用
MFC
框架下的AfxBeginThread函数创建
线程
的方法。详细解释了各参数的作用,包括
线程
函数指针、传递参数、优先级设置等,并提供了实际应用示例。
MFC
不能多
线程
操作控件的原因
本文深入探讨了
MFC
在多
线程
环境下的安全性问题,分析了
MFC
对象为何不宜在
线程
间传递的原因,并提出了相应的解决方案。
mfc
对象指针不能在
线程
间传输!
探讨
MFC
多
线程
编程中的常见问题,包括
MFC
对象跨
线程
使用的风险及解决策略,深入分析
MFC
线程
安全机制。
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章