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;
}


问题是我怎么调用自定义函数,并且我的界面不会卡死.
...全文
1953 点赞 收藏 236
写回复
236 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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没有累加
回复
加载更多回复
相关推荐
发帖
进程/线程/DLL
创建于2007-09-28

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2018-06-20 02:34
社区公告
暂无公告