作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发小型 gif 图像查看器程序。由于解码整个 gif 需要几秒钟,我决定使用单独的线程在后台对其进行解码,并且(经过适当的调整)让程序在启动后开始平滑地显示 gif。使用第一种方法,程序等待(几秒钟)直到整个 gif 被解析,然后开始显示它,一切正常。使用第二种方法,程序在加载第一帧后立即开始显示 gif,然后以怪诞的方式(因为尚未调整)显示已加载的帧,直到所有帧都加载完毕。我在这两种方法中使用完全相同的解析和显示函数,但问题是,在线程方法中,线程完成并退出后,gif显示速度稍慢,应该与第一种方法相同,因为线程已退出。所以我的问题是,线程是否有可能对进程产生永久性影响,即使它们已经完成?
(我确定他们正在退出,因为我使用 CloseHandle 函数并且它返回 1。)
我也会复制一些代码,但它们是非常聪明的摘录,不多说:
请注意,我将帧转换为 hbitmap 以在窗口上显示它们
第一种方法:
gifImage->findFrames();
frames_bitmaps=(HBITMAP *)malloc(gifImage->getFramesQuantity()*sizeof(HBITMAP));
for(int i=0;i<gifImage->getFramesQuantity();i++)
{
frames_bitmaps[i]=gifImage->getFrame(i)->convertToDIB(hwnd);
}
startDisplay();
//"main" function:
DWORD id1,id2;
findThread=CreateThread(NULL, 0, startFindFrames, (void*) this, 0, &id1);
fillThread=CreateThread(NULL, 0, startfillBitmaps, (void*) this, 0, &id2);
//the actual functions (these in CreateThread func are static for compatibility and contain the following ones):
void GifExplodeWindow::findFrames()
{
gifImage->findFrames();
loading_done=1;
}
void GifExplodeWindow::fillBitmaps()
{
while(!loading_done)
{
int current_quantity=gifImage->getFramesQuantity();
if(filled_bitmaps<current_quantity)
{
frames_bitmaps=(HBITMAP *)realloc(frames_bitmaps,current_quantity*sizeof(HBITMAP));
for(;filled_bitmaps<current_quantity;filled_bitmaps++)
{
frames_bitmaps[filled_bitmaps]=gifImage->getFrame(filled_bitmaps)->convertToDIB(hwnd);
if(filled_bitmaps==0 && current_quantity!=0)
{
display_state=PREVIEW;
changeDisplay();
}
filled_bitmaps++;
}
}
Sleep(50);
}
}
最佳答案
推荐:
Do finished threads have impact on a main program in winapi?
CloseHandle
,你
不要关闭线程,你
不要启动线程关闭。
Closing a thread handle does not terminate the associated thread or remove the thread object.
CloseHandle
只是关闭句柄,但您需要在代码中添加额外说明
关闭 你的线程函数。
MessageBox
。 ,或对话框。因此可以安全地假设,您的线程类型就是通常所说的“工作线程”。
PostMessage
从线程函数发送到主线程(GUI、对话框)的自定义消息来完成的。 API,或通过设置事件对象。
TerminateThread
关闭你的线程或
ExitThread
API。线程函数应该正常返回,不应该被强行中止。
关于c++ - 完成的线程对winapi中的主程序有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18922068/
我是一名优秀的程序员,十分优秀!