处理流程如下:
点击主界面上的一个按钮创建一个对话框,点击对话框上的一个按钮,程序就处理数据,处理完之后将处理结果放到一个全局的结构体中,再用CreateThread创建线程并将结构体的地址传给线程,然后对话框自动关闭。线程的功能是打印结构体中的数据。现在的问题是:如果对话框关闭的话,线程就会在到StartDoc这个函数的时候停掉了,如果不关闭对话框,线程就能正常打印。这是为什么??
点击主界面上的一个按钮创建一个对话框,点击对话框上的一个按钮,程序就处理数据,处理完之后将处理结果放到一个全局的结构体中,再用CreateThread创建线程并将结构体的地址传给线程,然后对话框自动关闭。线程的功能是打印结构体中的数据。现在的问题是:如果对话框关闭的话,线程就会在到StartDoc这个函数的时候停掉了,如果不关闭对话框,线程就能正常打印。这是为什么??
StartDoc是什么函数?全局的结构体你有是在哪定义的,怎么定义?
{
TransInfo ti;
int iReprintFlag;
int iPrintTimes;
HWND hWnd;
}PrintingInfo;
PrintingInfo prtinfo; //全局变量//打印函数
int prtfun(HWND hWnd, TransInfo *ti, int iReprintFlag)
{
char szprinter[512];
char *szDevice=NULL, *szDriver=NULL, *szOutput=NULL;
HDC hdcprint;
static DOCINFO di={sizeof(DOCINFO),"printer",NULL}; // 得到设备字符串存入数组szprinter中
memset(szprinter, 0, sizeof(szprinter));
if(psPrinterInfo[0] == 0 || psPrinterInfo[0] == '0')
GetProfileString("windows","device",",,,",szprinter,512);
else
strncpy(szprinter, psPrinterInfo, sizeof(szprinter)); //psPrinterInfo是主线程中的全局变量。 // 将设备字符串分解
if(NULL!=(szDevice=strtok(szprinter,",")) &&
NULL!=(szDriver=strtok(NULL,",")))
{ if((hdcprint=CreateDC(szDriver,szDevice,NULL,NULL))!=0)
{
//***** 在这里将ti的内容写入日志中还是正确的。
if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
{
//******* 在这里将ti的内容写入日志看到的就是乱码了。
StartPage(hdcprint);
SaveDC(hdcprint);
//...(用TextOut函数进行打印,打到纸上的是乱码。)
RestoreDC(hdcprint,-1);
EndPage(hdcprint);
EndDoc(hdcprint);
}
DeleteDC(hdcprint);
}
}
return(0);
}//线程执行函数
DWORD WINAPI PrintFolioTI_(LPVOID lpParameter)
{
PrintingInfo *prtinfo = NULL; prtinfo = (PrintingInfo *)malloc(sizeof(PrintingInfo));
memset(prtinfo, 0, sizeof(PrintingInfo));
memcpy(prtinfo, (PrintingInfo *)lpParameter, sizeof(PrintingInfo));
ret = prtfun(prtinfo->hWnd, &(prtinfo->ti), prtinfo->iReprintFlag);
free((void *)prtinfo);
return(ret);
}//创建线程的函数
int PrintFolioTI(HWND hWnd, TransInfo *ti, int iReprintFlag, int iPrintTimes)
{
HANDLE hThread;
DWORD dwThreadId=0; memset(&prtinfo, 0, sizeof(PrintingInfo));
memcpy(&(prtinfo.ti), ti, sizeof(TransInfo));
WriteLog2(prtinfo.ti.sDateTime, "DateTime: ");
prtinfo.iPrintTimes = iPrintTimes;
prtinfo.iReprintFlag = iReprintFlag;
prtinfo.hWnd = hWnd;
hThread = CreateThread(NULL, 0, PrintFolioTI_, (LPVOID)(&prtinfo), 0, &dwThreadId);
if (hThread == NULL)
{
WriteLog2("Failed to create printing thread!", "");
}
CloseHandle(hThread);
return(0);
}
而且还有一个奇怪的地方,这段代码在另外一个程序里执行是正常的,我拿到另外一个程序里就不正常了。
没用MFC。这个对话框也是动态创建的,对话框关闭了之后主程序还是在运行的。