大侠们,请来帮助我

cuilin2002 2002-09-12 09:59:23
我在线程里使用进度条(progessbar)设置的是循环
while(1)
{
Sleep(100);
Form1->P1->Min=0;
Form1->P1->Max=10;
Form1->P1->Step=1;
}
但我关闭窗口时出错
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
int result;
result=MessageBox(Handle,"是否要退出?", "提示", MB_OKCANCEL);
if(result==IDOK)
{
CanClose=true;
}
else
{
CanClose=false;
}
}
错误是出现cpu的一个框,我不明白汇编看不懂。但是是与进度条有关
...全文
31 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
bacer 2002-09-14
  • 打赏
  • 举报
回复
to:jishiping(JSP 季世平)
WaitForSingleObject...之后还需要CloseHandle(hThread);否则会造成资源泄漏
另外在应用中很少thread内部在循环时候不用sleep
可以先CreateEvent ,thread内部WaitForSingleObject(event,100)
然后OnClose时候SetEvent
cuilin2002 2002-09-14
  • 打赏
  • 举报
回复
问题终于解决了,心情好爽,谢谢各位,接分
cuilin2002 2002-09-13
  • 打赏
  • 举报
回复
季老大,我试了
DWORD ID;
CreateThread(NULL,0,MainDBThread,NULL,0,&ID);
//建立线程(MainDBThread是线程句柄吗?)
if (CanClose) {
TerminateThread = true;
WaitForSingleObject(MainDBThread, INFINITE);
}

//这样做对吗?
//还是同样出错,总是TForm的析构函数出错
jishiping 2002-09-13
  • 打赏
  • 举报
回复
To Hawk_sun(骑士):
你上面的代码有3个错误。第一,在线程内,线程一旦运行,就将Event1置为
有信号的状态,主线程的FormCloseQuery等于白搭。第二,FormCloseQuery
里,无论是否允许关闭,始终执行WaitForSingleObject。第三,线程无法主
动退出,除非是程序结束,系统强迫线程结束。综上所述,你的代码的效果
和贴主的原先的代码效果一样(甚至更糟糕)。
jishiping 2002-09-13
  • 打赏
  • 举报
回复
MainDBThread是线程的执行函数,不是线程句柄。CreateThread返回的就是
线程句柄。

HANDLE hThread = NULL; //一个全局变量

DWORD ID;
hThread = CreateThread(NULL,0,MainDBThread,NULL,0,&ID);

//程序退出时
if (CanClose) {
TerminateThread = true;
WaitForSingleObject(hThread, INFINITE);
}
hzg115 2002-09-12
  • 打赏
  • 举报
回复
没有用的,我也碰到这个问题过,但是用ListBox,但是如果访问ListView就不会了,也许是VCL的有些控件相关线程安全性太差引起的,换了东东吧
kingcaiyao 2002-09-12
  • 打赏
  • 举报
回复
你这样:
while(!Terminated)
{
Application->ProcessMessages();
Form1->P1->Min=0;
Form1->P1->Max=10;
Form1->P1->Step=1;
}
退出时
先终止你的线程:
YourThread->Terminate();

gfh21cn 2002-09-12
  • 打赏
  • 举报
回复
我对API创建线程不熟悉
不过,我想原理基本差不多

这是我在msdn上查到的
BOOL TerminateThread(
HANDLE hThread, // handle to thread
DWORD dwExitCode // exit code
);
你用CreateThread应该返回一个句柄的
你把这个句柄作为参数传进去
就可以释放线程了
cuilin2002 2002-09-12
  • 打赏
  • 举报
回复
up
cuilin2002 2002-09-12
  • 打赏
  • 举报
回复
我是用API函数创建的线程需要用TerminateThread()来结束可怎么写?
楼上的请在帮帮忙
gfh21cn 2002-09-12
  • 打赏
  • 举报
回复
你试了我的做法了吗

可不可以
我估计你有个线程没有被释放导致的错误

cuilin2002 2002-09-12
  • 打赏
  • 举报
回复
我在结束是有一个线程的Status属性为False其他的为Unknown
gfh21cn 2002-09-12
  • 打赏
  • 举报
回复
你的线程是不是自动释放的
FreeOnTerminate=true;

你只要调出循环线程便会结束
同时你在OnCloseQuery里检测各个线程是不是都已经释放了
等全部释放再退出。
也就是说处理这个事件的时候

while(ThreadCount)
{
//等
}


ThreadCount是线程个数 初始为0
在线程创建的时候++
在线程释放的时候--
cuilin2002 2002-09-12
  • 打赏
  • 举报
回复
up
cuilin2002 2002-09-12
  • 打赏
  • 举报
回复
不行啊,我是把循环写到线程中的,我想是不是VCL在线程中使用的问题啊
gfh21cn 2002-09-12
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "test.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool tClose=false;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ExportToExcell(StringGrid1);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
while(1)
{
Sleep(100);
Form1->p1->Min=0;
Form1->p1->Max=10;
Form1->p1->Step=1;
Application->ProcessMessages();
if(tClose)
break;
}

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
tClose=true;
CanClose=true;
}
//---------------------------------------------------------------------------
cuilin2002 2002-09-12
  • 打赏
  • 举报
回复
不是,没有Sleep(100)也出
gfh21cn 2002-09-12
  • 打赏
  • 举报
回复
我觉得是sleep的问题

gfh21cn 2002-09-12
  • 打赏
  • 举报
回复
你在循环力加句
Application->ProcessMessage();


cuilin2002 2002-09-12
  • 打赏
  • 举报
回复
自己up哎
加载更多回复(6)

13,825

社区成员

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

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