能否看看下面代码如何修改!!!!!!

mxp 2000-05-11 05:34:00
按钮_Click中
int i,j,k;
for (i=1;i<10000;i++)
for(j=1;j<10000;j++)
for(k=1;k<10000;k++)
{
Label1->Caption=IntToStr(i) + "a" + IntToStr(j) + "a" + IntToStr(k);
Sleep(1);
Application->ProcessMessages();
}

按钮2_Click中
this->Close();

可是单击按钮1后按钮2关闭无效!!!
...全文
344 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
skt642 2001-05-31
  • 打赏
  • 举报
回复
63234关注!
mxp 2000-05-24
  • 打赏
  • 举报
回复
bug001大侠请到 C++builder中的读取Gif文件贴中签名,得能否看看下面代码如何修改!!!!!!的第二次分数
mxp 2000-05-18
  • 打赏
  • 举报
回复
非常感谢各位的帮助,学到了不少新东西。
致各位朋友十二分谢意!
真诚祝福各位朋友
天天有个好心情!
请wxz、bug001、kxy到c++builder中的读取Gif文件贴中签名,人聚齐了就给分!!为防止有人分多天不来,先每个人加1分,从bug001的10分中先扣,别在意,到那里在给你补回来。
我马上将gif贴子提前!!!
kxy 2000-05-18
  • 打赏
  • 举报
回复
你可以看看TThread的源码,就很清楚了。TThread又不长:)
kxy 2000-05-18
  • 打赏
  • 举报
回复
防止你直接调用,Execute :-)
kxy 2000-05-18
  • 打赏
  • 举报
回复
每个线程到要有执行代码,delphi中,此执行代码的入口是execute.(可以这样认为)
其他的函数在Execute中调用不就行了。你可以看看TThread的源码,就很清楚了。
mxp 2000-05-18
  • 打赏
  • 举报
回复
为什么Execute()函数要在线程类的protected:部分声明?
谢谢!
mxp 2000-05-18
  • 打赏
  • 举报
回复
谢谢kxy!
“你在windows中写程序,不止你一个进程”最经典!
最后问的是 MyProcess2->Resume();是不是默认指向MyProcess2->Execute();,要是有多个函数怎么办?我不想执行Execute()。
kxy 2000-05-18
  • 打赏
  • 举报
回复
windows 32位系统中,是抢占多任务系统,由系统核心以轮转方式安排各个线程
的CPU时间。线程所分配的优先级范围是1-31. kernel对相同优先级的thread
分配相同的CPU时间片。如果高优先极的thread从来不睡眠,低优先机的thread
就不会被执行。不过,实际上,大多数thread长期处于睡眠。
windows中有进程优先级和线程相对优先级。
windows支持四中进程优先级, idle = 级别4 , Normal= 9/7 High=13 ReakTime=24
线程相对优先级。五种 lowest = 比所属进程小2 ,below_normal = -1
normail = 0 , above_normal = + 1, highest=+2.
在进程中创建的Thread的优先级,缺省= normal.
windows把进程和线程相对优先级结合,得到该线程的基优先数。
〉〉没有并发线程的啊,你在windows中写程序,不止你一个进程:)
FreeOnTerminate不一定非写,如果 = false,要自己free.
>>那个执行悬挂线程是不是将线程所有函数都执行了,还是只执行Execute(),它>>是不是只能在受类的保护的中声明?
没有看明白:)


mxp 2000-05-18
  • 打赏
  • 举报
回复
kxy大侠,线程方面我确实不是很清楚,所以要问问大家。
我不是说每句话的含义,而是为什么要这么用,设置优先级有什么用的?没有并发线程的啊,是不是非要写上执行完成后线程就要注销,不写会不会消失,那个执行悬挂线程是不是将线程所有函数都执行了,还是只执行Execute(),它是不是只能在受类的保护的中声明?
kxy 2000-05-18
  • 打赏
  • 举报
回复
>>给一下
>> MyProcess2->Priority = tpNormal;
>> MyProcess2->FreeOnTerminate = true;
>> MyProcess2->Resume();
>>的注解!
帮助中写的很详细,这是线程的基本知识,你老兄是不是从来不看帮助的:)
mxp 2000-05-18
  • 打赏
  • 举报
回复
非常感谢各位的帮助,不过这里的分不够,当问题完成时vmi和bug001会在以前的做法上各得10分,线程方面,我在结束问题时会通知线程或其他方案的各位将读取Gif提前,(显示在最新问题中)除了给那里热心朋友的18分外,其余60分都将加入到这个问题中。
wxy大侠的说法当连续按按钮1是不是要出问题,能否象bug001大侠的方式给一个详细自己做法的例子。
也请问bug001大侠,是不是只能在守保护部分声明函数,在私有的和公有的行不行,公有的是不是最好作为线程通信。
给一下
 MyProcess2->Priority = tpNormal;
MyProcess2->FreeOnTerminate = true;
MyProcess2->Resume();
的注解!
                再次谢谢各位!!!

Bug001 2000-05-18
  • 打赏
  • 举报
回复
线程解决方案
在表单头文件中加入线程类的声明,并声明该类的全局变量
//---------------------------------------------------------------------------
class TMyThread1: public TThread //线程类1的声明
{
private:
protected:
virtual void __fastcall Execute(void);
public:
__fastcall TMyThread1():TThread(true){};
__published:
};

class TMyThread2: public TThread //线程类2的声明
{
private:
protected:
virtual void __fastcall Execute(void);
public:
__fastcall TMyThread2():TThread(true){};
__published:
};

extern PACKAGE TForm1 *Form1;
TMyThread1 *MyProcess1; //声明线程类的全局变量
TMyThread2 *MyProcess2;






在源程序文件中给出线程的实现体

void __fastcall TMyThread1::Execute()
{
int i,j,k;

for (i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
for(k=1;k<100;k++)
{
if(!Terminated)
{
Form1->Label1->Caption=IntToStr(i)+"a"+IntToStr(j)+"a"+IntToStr(k);// 
Sleep(1);
}
else
{ break; }
}
}
}
}


void __fastcall TMyThread2::Execute()
{
int i,j,k;

for (i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
for(k=1;k<100;k++)
{
if(!Terminated)
{
Form1->Label2->Caption=IntToStr(i)+"a"+IntToStr(j)+"a"+IntToStr(k);
Sleep(1);
}
else
{
break;
}
}
}
}
}


在表单的OnCreate事件中初始线程类的全局变量

void __fastcall TForm1::FormCreate(TObject *Sender)
{
MyProcess1=NULL;
MyProcess2=NULL;
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(MyProcess2!=NULL)
{ MyProcess2->Terminate(); }
if(MyProcess1!=NULL)
{ MyProcess1->Terminate(); }

MyProcess1 = new TMyThread1();
MyProcess1->Priority = tpNormal;
MyProcess1->FreeOnTerminate = true;
MyProcess1->Resume();
}


void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(MyProcess1!=NULL)
{ MyProcess1->Terminate();}
if(MyProcess2!=NULL)
{ MyProcess2->Terminate();}

MyProcess2 = new TMyThread2();
MyProcess2->Priority = tpNormal;
MyProcess2->FreeOnTerminate = true;
MyProcess2->Resume();

}

在表单的OnCloseQuery事件中终止线程的执行

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
if(MyProcess1!=NULL)
{ MyProcess1->Terminate();}
if(MyProcess2!=NULL)
{ MyProcess2->Terminate();}
}
wxz 2000-05-18
  • 打赏
  • 举报
回复
错了
用线程处理循环处理部分,可定义一个全局变量boolRun,
按下按钮1时boolRun=true;检查线程是否运行,如没有运行则激活线程,
按下按钮2时boolRun=false;
线程执行代码参考为:
int i,j,k;
for (i=1;i<10000;i++)
for(j=1;j<10000;j++)
for(k=1;k<10000;k++)
{
if(!boolRun)Terminate();
Sleep(1);
Label1->Caption=IntToStr(i) + "a" + IntToStr(j) + "a" + IntToStr(k);
}// Label1标签变量可设置为线程的入参
wxz 2000-05-18
  • 打赏
  • 举报
回复
用线程处理循环处理部分,可定义一个全局变量boolRun,
按下按钮1时boolRun=true;检查线程是否运行,如没有运行则激活线程,
按下按钮2时boolRun=false;
线程执行代码参考为:
int i,j,k;
for (i=1;i<10000;i++)
for(j=1;j<10000;j++)
for(k=1;k<10000;k++)
{
if(boolRun)Terminate();
Sleep(1);
Label1->Caption=IntToStr(i) + "a" + IntToStr(j) + "a" + IntToStr(k);
}// Label1标签变量可设置为线程的入参
mxp 2000-05-12
  • 打赏
  • 举报
回复
谢谢两位,我会为两位把分加上,实际上我的想法是有多个类似按钮1的按钮,当按其中一个按钮时其它按钮Click事件进程终止,开始执行本按钮的Click!那么这样写法就不行了!
除了我的想法外,不知两位还有什么高见!有没有能直接结束前一个事件的语句,不用在转移回去判断。

比如改为:
如:
//按钮1

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,j,k;
for (i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
for(k=1;k<100;k++)
{
if(IsAskedClose)
{break;}

Label1->Caption=IntToStr(i)+"a"+IntToStr(j)+"a"+IntToStr(k);
Sleep(1);
Application->ProcessMessages();
}
}
}
}

//按钮2
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int i,j,k;
for (i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
for(k=1;k<100;k++)
{
if(IsAskedClose)
{break;}

Label1->Caption=IntToStr(i)+"a"+IntToStr(j)+"a"+IntToStr(k);
Sleep(1);
Application->ProcessMessages();
}
}
}
}

我的想法是将判断变量改为整形数,因为到 Application->ProcessMessages();就可以提交了,不用等到Button2执行完成。多加几个break;会使效率大大提高。
//按钮1
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,j,k;
IsAskedClose=1;
for (i=1;i<10;i++)
{
if(IsAskedClose!=1)
{break;}
for(j=1;j<10;j++)
{
if(IsAskedClose!=1)
{break;}
for(k=1;k<100;k++)
{
if(IsAskedClose!=1)
{break;}
Label1->Caption=IntToStr(i)+"a"+IntToStr(j)+"a"+IntToStr(k);
Sleep(1);
Application->ProcessMessages();
}
}
}
}

//按钮2
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int i,j,k;
IsAskedClose=2;
for (i=1;i<10;i++)
{
if(IsAskedClose!=2)
{break;}
for(j=1;j<10;j++)
{
if(IsAskedClose!=2)
{break;}
for(k=1;k<100;k++)
{
if(IsAskedClose!=2)
{break;}
Label1->Caption=IntToStr(i)+"a"+IntToStr(j)+"a"+IntToStr(k);
Sleep(1);
Application->ProcessMessages();
}
}
}
}

还有没有其他的好主意?新提主意可在C++Builder中的读Gif动画中签名,我会再为您加20分。(为那里的几位热心人加分后就可以结束该问题了)

Bug001 2000-05-11
  • 打赏
  • 举报
回复
在表单头文件的类声明中添加变量 IsAskedClose
public: // User declarations
bool IsAskedClose;

在表单的OnShow事件中
void __fastcall TForm1::FormShow(TObject *Sender)
{
IsAskedClose=false;
}
在Button1的OnClick事件中添加代码
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,j,k;
for (i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
for(k=1;k<100;k++)
{
if(IsAskedClose)
{break;}

Label1->Caption=IntToStr(i)+"a"+IntToStr(j)+"a"+IntToStr(k);
Sleep(1);
Application->ProcessMessages();
}
}
}
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
this->Close();
}
在表单的OnCloseQuery事件中添加
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
IsAskedClose=true;
}
Bug001 2000-05-11
  • 打赏
  • 举报
回复
在表单头文件的类声明中添加变量 IsAskedClose
public: // User declarations
bool IsAskedClose;

在表单的OnShow事件中
void __fastcall TForm1::FormShow(TObject *Sender)
{
IsAskedClose=false;
}
在Button1的OnClick事件中添加代码
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,j,k;
for (i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
for(k=1;k<100;k++)
{
if(IsAskedClose)
{break;}

if(this->Active==false)
{break;}
Label1->Caption=IntToStr(i)+"a"+IntToStr(j)+"a"+IntToStr(k);
Sleep(1);
Application->ProcessMessages();
}
}
}
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
this->Close();
}
在表单的OnCloseQuery事件中添加
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
IsAskedClose=true;
}
vmi 2000-05-11
  • 打赏
  • 举报
回复
可以在FORM中加一个变量:bool IsClose,初始化为false.
按纽1_Click中
int i,j,k;
for (i=1;i<10000;i++)
for(j=1;j<10000;j++)
for(k=1;k<10000;k++)
{
if(IsClose) break;
Sleep(1);
Application->ProcessMessages();
Label1->Caption=IntToStr(i) + "a" + IntToStr(j) + "a" + IntToStr(k);
}

按钮2_Click中
IsClose=true;
this->Close();


13,825

社区成员

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

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