我正在开发小型 gif 图像查看器程序。由于解码整个 gif 需要几秒钟,我决定使用单独的线程在后台对其进行解码,并且(经过适当的调整)让程序在启动后开始平滑地显示 gif。使用第一种方法,程序等待(几秒钟)直到整个 gif 被解析,然后开始显示它,一切正常。使用第二种方法,程序在加载第一帧后立即开始显示 gif,然后以怪诞的方式(因为尚未调整)显示已加载的帧,直到所有帧都加载完毕。我在这两种方法中使用完全相同的解析和显示函数,但问题是,在线程方法中,线程完成并退出后,gif显示速度稍慢,where 应该与第一种方法中的相同,因为线程已经退出。所以我的问题是,线程是否有可能对进程产生永久性影响,即使它们已经完成?(我确定他们正在退出,因为我使用 CloseHandle 函数并且它返回 1。)
我也会复制一些代码,但它们是非常聪明的摘录,不多说:
请注意,我将帧转换为 hbitmap 以在 window
First 方法上显示它们:
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);
}
}
我最初编写代码只是为了让它工作,当我解决我的问题时我会纠正它,但现在唯一重要的是它的作用