大概流程是這樣的,打開檔案>選擇TXT檔案>while回圈(讀取第i行>寫入第i行>發送第i行>sleep())代碼如下不知道那錯了,
UINT CNetworkSendDataDlg::zhuhangTimeThread(LPVOID lpParam)
{
CNetworkSendDataDlg *pDlg = (CNetworkSendDataDlg *)lpParam;
CFileDialog cFileDlg(TRUE, _T("txt"), (LPCTSTR)NULL, OFN_ENABLESIZING | OFN_EXPLORER | OFN_PATHMUSTEXIST |
OFN_LONGNAMES | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_CREATEPROMPT,
_T("Text Files(*.txt)|*.txt|All Files (*.*)|*.*||"));
CStdioFile file(cFileDlg.GetPathName(), CFile::modeRead);
CString strTime, strOneline;
pDlg->GetDlgItemText(IDC_EDIT_SEND, strTime);
while (file.ReadString(strOneline))
{
pDlg->m_EditSend.ReplaceSel(strOneline + "\n");
send(pDlg->m_clientSocket, strTime.GetBuffer(0), strTime.GetLength(), 0);
Sleep(1000);
}
return 0;
}
void CNetworkSendDataDlg::OnBnClickedButton3()
{
// TODO: 在此添加控制元件通知處理程式代碼
CWinThread *testThread;
testThread = AfxBeginThread(zhuhangTimeThread, NULL);
}
uj5u.com熱心網友回復:
Sleep(1000); 延時改短uj5u.com熱心網友回復:
我這個延時是可改的,我只是現在設1s,我改了還是不行。uj5u.com熱心網友回復:
while (file.ReadString(strOneline))
{
pDlg->m_EditSend.ReplaceSel(strOneline + "\n");
send(pDlg->m_clientSocket, (LPCTSTR)strTime, strTime.GetLength() * sizeof(TCHAR), 0);
Sleep(1000);
}
file.Close();
uj5u.com熱心網友回復:
輔助執行緒一般不能直接訪問主執行緒的視窗控制元件等等物件的,這個會造成程式例外的uj5u.com熱心網友回復:
作業執行緒最好不要操作界面,如果想在視窗顯示資訊,作業執行緒發送訊息吧。uj5u.com熱心網友回復:
不操作界面,那作業執行緒怎么呼叫界面執行緒的引數變數的?像上面的作業執行緒要讀取文本的每一行,這txt的每一行又如何傳遞到作業執行緒里面的?
uj5u.com熱心網友回復:
postMessage()給你的對應的重繪顯示到界面的函式 把獲取的內容作為引數傳過去uj5u.com熱心網友回復:
如果你的界面此時關掉 看看你程式會不會崩潰uj5u.com熱心網友回復:
注意 Sleep(1000); 是 主執行緒 Sleep,void DoEvents()
{
MSG msg;
// Process existing messages in the application's message queue.
// When the queue is empty, do clean up and return.
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{// has msg
if (!AfxGetThread()->PumpMessage()) break;
}
}
Sleep(1000); 改為 DoEvents()
uj5u.com熱心網友回復:
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspxuj5u.com熱心網友回復:
用PostMessage,在主執行緒上監聽這個訊息,然后把讀取的文字傳過來,不就OK?至于傳參 你可以定義一個string,在子執行緒賦值,訊息讀取
uj5u.com熱心網友回復:
用了 void DoEvents() ;不需要 多執行緒uj5u.com熱心網友回復:
作業執行緒最好不要操作界面,如果想在視窗顯示資訊,作業執行緒發送訊息吧。
不操作界面,那作業執行緒怎么呼叫界面執行緒的引數變數的?像上面的作業執行緒要讀取文本的每一行,這txt的每一行又如何傳遞到作業執行緒里面的?
用PostMessage,在主執行緒上監聽這個訊息,然后把讀取的文字傳過來,不就OK?至于傳參 你可以定義一個string,在子執行緒賦值,訊息讀取
我沒明白啥意思,我還是處于學習階段,麻煩能具體一點嗎
uj5u.com熱心網友回復:
主要就是用PostMessage方式把資料從作業執行緒發送到主執行緒,所有UI操作由主執行緒來處理uj5u.com熱心網友回復:
主要就是用PostMessage方式把資料從作業執行緒發送到主執行緒,所有UI操作由主執行緒來處理
是不是把那個回圈放到PostMessage里然后在訊息處理函式里呼叫就行了?
uj5u.com熱心網友回復:
作業執行緒最好不要操作界面,如果想在視窗顯示資訊,作業執行緒發送訊息吧。
不操作界面,那作業執行緒怎么呼叫界面執行緒的引數變數的?像上面的作業執行緒要讀取文本的每一行,這txt的每一行又如何傳遞到作業執行緒里面的?
用PostMessage,在主執行緒上監聽這個訊息,然后把讀取的文字傳過來,不就OK?至于傳參 你可以定義一個string,在子執行緒賦值,訊息讀取
我還是沒有明白,能說具體點嗎
uj5u.com熱心網友回復:
作業執行緒最好不要操作界面,如果想在視窗顯示資訊,作業執行緒發送訊息吧。
不操作界面,那作業執行緒怎么呼叫界面執行緒的引數變數的?像上面的作業執行緒要讀取文本的每一行,這txt的每一行又如何傳遞到作業執行緒里面的?
用PostMessage,在主執行緒上監聽這個訊息,然后把讀取的文字傳過來,不就OK?至于傳參 你可以定義一個string,在子執行緒賦值,訊息讀取
我還是沒有明白,能說具體點嗎
1. #define WM_READTXT WM_USER + 200 //頭檔案自定義訊息
2.//在源檔案中寫訊息映射 具體寫法百度
3. //頭檔案宣告訊息函式
4.UINT CNetworkSendDataDlg::zhuhangTimeThread(LPVOID lpParam)
{
CNetworkSendDataDlg *pDlg = (CNetworkSendDataDlg *)lpParam;
CFileDialog cFileDlg(TRUE, _T("txt"), (LPCTSTR)NULL, OFN_ENABLESIZING | OFN_EXPLORER | OFN_PATHMUSTEXIST |
OFN_LONGNAMES | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_CREATEPROMPT,
_T("Text Files(*.txt)|*.txt|All Files (*.*)|*.*||"));
CStdioFile file(cFileDlg.GetPathName(), CFile::modeRead);
CString strTime, strOneline;//設成全域變數
while (file.ReadString(strOneline))
{
PostMessage(WM_READTXT,0,0);//發送訊息
Sleep(30);
}
return 0;
}
5.在你訊息函式里面
{
m_EditSend.ReplaceSel(strOneline + "\n");
send(pDlg->m_clientSocket, strTime.GetBuffer(0), strTime.GetLength(), 0);
}
不過我記得好像在你執行緒里面,whlie下,用SendMessage(顯示文字的文本框句柄,text,引數忘了),能直接傳遞
uj5u.com熱心網友回復:
啟動執行緒沒問題,問題是子執行緒不能直接操作主執行緒,更安卓編程一樣。要么用postmessage, 要么不用子執行緒的方式,主執行緒用 settimer 啟動發送
uj5u.com熱心網友回復:
在按鈕訊息處理函式里面做大量操作,肯定會出現假死現象,要避免就得開個執行緒發資料了。uj5u.com熱心網友回復:
其實,這種操作用易語言實作很容易,。。uj5u.com熱心網友回復:
我用postMessage從來就沒成功過,都是用sendMessage
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/79689.html
標籤:進程/線程/DLL
上一篇:VC中如何自定義控制元件?
下一篇:對話框標題顏色問題
