gpt4 book ai didi

winapi - 如何在win32中使用线程功能显示进度条?

转载 作者:行者123 更新时间:2023-12-03 13:06:02 24 4
gpt4 key购买 nike

在我的应用程序中,我有一个简单的模块,我将读取一些需要执行的过程的文件
几秒钟..所以我想在文件正在进行时显示一个进度条(使用工作线程)。我创建了一个线程(代码如下所示),并且我设计了一个带有进度控制的对话框窗口。我使用了函数 MyThreadFunction下面显示进度条,但它只显示一次并消失,我不知道如何使它工作。尽管我是线程新手,但我尽了最大努力。请帮助我这个 friend 。

reading files
void ReadMyFiles()
{

for(int i = 0; i < fileCount ; fileCount++)
{
CWinThread* myThread = AfxBeginThread((AFX_THREADPROC)MyThreadFunction,NULL);
tempState = *(checkState + index);
if(tempCheckState == NOCHECKBOX)
{
//my operations
}
else//CHECKED or UNCHECKED
{
//myoperation
}
myThread->PostThreadMessage(WM_QUIT,NULL,NULL);
}
}

thread functions
UINT MyThreadFunction(LPARAM lparam)
{
HWND dialogWnd = CreateWindowEx(0,WC_DIALOG,L"Proccessing...",WS_OVERLAPPEDWINDOW|WS_VISIBLE,
600,300,280,120,NULL,NULL,NULL,NULL);
HWND pBarWnd = CreateWindowEx(NULL,PROGRESS_CLASS,NULL,WS_CHILD|WS_VISIBLE|PBS_MARQUEE,40,20,200,20,
dialogWnd,(HMENU)IDD_PROGRESS,NULL,NULL);

MSG msg;

PostMessage( pBarWnd, PBM_SETRANGE, 0, MAKELPARAM( 0, 100 ) );
PostMessage(pBarWnd,PBM_SETPOS,0,0);
while(PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE))
{
if(msg.message == WM_QUIT)
{
DestroyWindow(dialogWnd);
return 1;
}
AfxGetThread()->PumpMessage();
Sleep(40);
}
return 1;


}

最佳答案

把它转过来,把阻塞行为放在工作线程中。

这是一个常见的错误,但它确实不值得在单个进程中创建多个 GUI 线程。

窗口消息被发布到线程队列:- 这意味着,在某些时候,一个子窗口或弹出窗口将尝试与另一个线程上的阻塞窗口进行通信。即使用户意外地尝试调整弹出窗口的大小或只是移动弹出窗口 - 这意味着两个窗口在耗时的过程中再次被阻塞以完成。

关于winapi - 如何在win32中使用线程功能显示进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2720353/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com