处理流程如下:
点击主界面上的一个按钮创建一个对话框,点击对话框上的一个按钮,程序就处理数据,处理完之后将处理结果放到一个全局的结构体中,再用CreateThread创建线程并将结构体的地址传给线程,然后对话框自动关闭。线程的功能是打印结构体中的数据。现在的问题是:如果对话框关闭的话,线程就会在到StartDoc这个函数的时候停掉了,如果不关闭对话框,线程就能正常打印。这是为什么??

解决方案 »

  1.   

    应该是没关系的,只跟进程有有关吧。对话框无非也是一个线程。
    StartDoc是什么函数?全局的结构体你有是在哪定义的,怎么定义?
      

  2.   

    相关代码如下:typedef struct tagPrintingInfo
    {
        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);
    }
    而且还有一个奇怪的地方,这段代码在另外一个程序里执行是正常的,我拿到另外一个程序里就不正常了。
      

  3.   

    mfc下,关闭对话框就是关闭程序. 应该重载OnClose,OnCancel 不关闭改为隐藏对话框.
      

  4.   


    没用MFC。这个对话框也是动态创建的,对话框关闭了之后主程序还是在运行的。