實作一個基于對話框的檔案傳輸,客戶端選擇一個檔案,在服務器端啟動一個執行緒函式,在serverdlg.cpp宣告如下
UINT server_thd(LPVOID p)
{
if( (ssocket = accept(listen_sock, (struct sockaddr *)&client_addr, &iaddrSize)) == INVALID_SOCKET)
{
//MessageBox(__T("創建監聽失敗"))
}
while(1)
{
res = recv(ssocket, msg, 1024, 0);
msg[res] = '\0';
::MessageBox(NULL,("Recv a File"),NULL,MB_OK);
CFileDialog dlg ( FALSE ) ;
dlg.m_ofn.hInstance = AfxGetInstanceHandle();
dlg.m_ofn.lpstrFilter= "All Files(*.*)|(*.*)";
dlg.m_ofn.lpstrFile = filename;
dlg.m_ofn.Flags &= ~OFN_EXPLORER;
if ( dlg.DoModal() == IDOK )
{
CFile file(filename, CFile::modeCreate| CFile::typeBinary| CFile::modeWrite);
}
}
}
傳輸txt和excel檔案都沒有問題,傳輸pdf和MP4檔案時,另存為對話框就打不開,單步調式進入
INT_PTR CFileDialog::DoModal()函式時,
if (m_ofn.hwndOwner != NULL && ::IsWindowEnabled(m_ofn.hwndOwner))
{
bEnableParent = TRUE;
::EnableWindow(m_ofn.hwndOwner, FALSE);
}
到::EnableWindow(m_ofn.hwndOwner, FALSE);就卡住了,
調式輸出顯示執行緒退出了。
執行緒 'Win32 執行緒' (0x1748) 已退出,回傳值為 0 (0x0)。
執行緒 'Win32 執行緒' (0x1f14) 已退出,回傳值為 0 (0x0)。
執行緒 'Win32 執行緒' (0x12fc) 已退出,回傳值為 0 (0x0)。
執行緒 'Win32 執行緒' (0x1628) 已退出,回傳值為 0 (0x0)。
求大神解答一下啊,困惑我好久了。
uj5u.com熱心網友回復:
在執行緒函式中打開個對話框,真是奇怪的想法啊.uj5u.com熱心網友回復:
好象邏輯也不對,1每接收1024位元組就存為一個檔案,要是發送的檔案位元組數大于1024怎么辦。
2 filename是保存檔案名,如果另存對話框中檔案名件名被人為修改就會出現問題
3 同 2樓
uj5u.com熱心網友回復:
2樓中也說有,邏輯有問題。檔案大小,自己好好處理。你這也太簡單的處理方法了uj5u.com熱心網友回復:
不能在作業執行緒里打開對話框,這是錯誤的,作業執行緒中沒有訊息回圈處理。你可以作業執行緒里發視窗訊息到主執行緒,進行UI的相關作業。把執行緒之間做好同步處理。uj5u.com熱心網友回復:
額,只是第一次傳輸過來檔案名和檔案大小,然后創建檔案,然后接收資料寫入,每次接收1024,寫入1024,具體根據傳輸多少位元組過來。另存為對話框中的檔案名是傳過來的,默認寫在另存為對話框上,被修改好像會出現問題,不過這只是一個小問題,知道是哪里錯了。主要我現在不知道哪里錯了,傳txt為什么都能夠正常。測驗的txt檔案大小3m,大于1024B的。
uj5u.com熱心網友回復:
為什么啊,就是想用執行緒監聽,有客戶端發送檔案過來,就彈出一個對話框啊。
uj5u.com熱心網友回復:
檔案大小的邏輯沒有問題,我傳txt幾兆的都可以,就是打開其他格式的檔案,另存為對話框打不開。我估計是我使用執行緒打開對話框的方式不對。不知道您指的邏輯是我處理檔案的邏輯還是這個,還是其他方面的邏輯,請不吝詳細指點一下唄。
uj5u.com熱心網友回復:
將檔案過濾型別改一下,后面加上\\。“All Files(*.*)|(*.*)||”試一下uj5u.com熱心網友回復:
執行緒中使用 需要初始化COMCoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
……
CoUninitialize();
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/134094.html
標籤:基礎類
