在視窗類外定義了一個TCP接收訊息函式A。然后在視窗類內定義了n個資料處理函式n1、n2、n3...。
A函式收到TCP資料后,
int iResult = SendMessageA(htestWnd, WM_TCPDATA_TREAT, msgType, (LPARAM)&receivePara);把收到的資料發給資料處理函式。
比如多個TCP埠收發資料時候,對效率要求又比較高的時候,這樣做是不是不太好呢?
然后多個埠同時受到資料,就會同時有幾個資料處理函式執行,這幾個資料處理函式是不是都是在一個執行緒里面?也就是視窗類主執行緒里。都在一個主執行緒里處理,但是我也沒見界面卡死。難道通過SendMessageA這樣出去的,接收函式系統自己新起了執行緒?
uj5u.com熱心網友回復:
SendMessage會等待視窗處理完才回傳結果PostMessage是發完就回傳
我一般用PostMessage
或者用虛擬串列處理界面顯示
鎖+容器
uj5u.com熱心網友回復:
SendMessage 是阻塞操作,建議后臺執行緒自己緩沖,可以提高吞吐量,另外模塊間的耦合度比較低,移植/更新的時候比較容易uj5u.com熱心網友回復:
意思是在資料處理函式里面開執行緒去處理然后資料處理函式先回傳嗎?
uj5u.com熱心網友回復:
恩恩,我知道post是異步。
請問,我在建立TCP連接時候,是一個連接一個執行緒。就是一個埠一個執行緒。然后埠收到資料,資料傳給資料處理函式執行。多個埠收到資料,多個資料處理函式執行是在主執行緒還是在各自的執行緒里?
sendmessage是阻塞的,post是非阻塞。這倆種發出去,資料處理的函式是執行在哪個執行緒里呢?
uj5u.com熱心網友回復:
我好像理解你的意思了 Tcp Socket的 Iocp 應該適合你
這樣你就不用去糾結處理執行緒了
uj5u.com熱心網友回復:
從你的描述看是一個執行緒收并SendMessage 一個執行緒(視窗類)處理接收執行緒收了包 Send的時候不會再去收下一個包(或是TCP協議會給你收了暫存等待你取用包,總之不涉及并發你的邏輯)
訊息本身的性質也決定 不管你視窗類中有多少種處理函式 他同時只處理一個訊息 不會出現一個視窗類 多執行緒在跑處理的情況
uj5u.com熱心網友回復:
從你的描述看是一個執行緒收并SendMessage 一個執行緒(視窗類)處理
接收執行緒收了包 Send的時候不會再去收下一個包(或是TCP協議會給你收了暫存等待你取用包,總之不涉及并發你的邏輯)
訊息本身的性質也決定 不管你視窗類中有多少種處理函式 他同時只處理一個訊息 不會出現一個視窗類 多執行緒在跑處理的情況
大概了解了。我的程式需要接收多個埠的資料,每個埠一個連接。都是采用這種接收->SEND->資料處理的方式。
還可以怎樣做能優化下效率嗎?我個人感覺,多執行緒除了防止界面假死外好像沒什么意義。反正都是一個核在跑...
還有一個問題,如果資料處理是在視窗類執行緒里處理的,界面咋沒死嘞
uj5u.com熱心網友回復:
從你的描述看是一個執行緒收并SendMessage 一個執行緒(視窗類)處理
接收執行緒收了包 Send的時候不會再去收下一個包(或是TCP協議會給你收了暫存等待你取用包,總之不涉及并發你的邏輯)
訊息本身的性質也決定 不管你視窗類中有多少種處理函式 他同時只處理一個訊息 不會出現一個視窗類 多執行緒在跑處理的情況
大概了解了。我的程式需要接收多個埠的資料,每個埠一個連接。都是采用這種接收->SEND->資料處理的方式。
還可以怎樣做能優化下效率嗎?我個人感覺,多執行緒除了防止界面假死外好像沒什么意義。反正都是一個核在跑...
還有一個問題,如果資料處理是在視窗類執行緒里處理的,界面咋沒死嘞
如果每個埠的通信不是不同的協議,實際上可以只開一個埠,服務器一般就是這么作業,1對多,然后你可根據連接進來的不同IP來區分每個客戶。
多執行緒可以充分利用多核CPU的,現在一般CPU都多核了,可以真實同時跑多個部分。如果網路并發量很大,可以像之前有人推薦的用IOCP,它可以只用幾個處理執行緒,減少太多執行緒背景關系切換帶來的開銷。
如果處理放在主界面的視窗類中,應該是每個處理都很快所以沒有察覺到卡住,可以試試在處理類中做個極費時的操作,界面應該會假死。
uj5u.com熱心網友回復:
在視窗類外定義了一個TCP接收訊息函式A。然后在視窗類內定義了n個資料處理函式n1、n2、n3...。
A函式收到TCP資料后,int iResult = SendMessageA(htestWnd, WM_TCPDATA_TREAT, msgType, (LPARAM)&receivePara);把收到的資料發給資料處理函式。
比如多個TCP埠收發資料時候,對效率要求又比較高的時候,這樣做是不是不太好呢?
然后多個埠同時受到資料,就會同時有幾個資料處理函式執行,這幾個資料處理函式是不是都是在一個執行緒里面?也就是視窗類主執行緒里。都在一個主執行緒里處理,但是我也沒見界面卡死。難道通過SendMessageA這樣出去的,接收函式系統自己新起了執行緒?
樓主不會自己列印寫執行緒id么,還浪費那么多時間去提問
uj5u.com熱心網友回復:
SendMessageA,本質上和直接呼叫訊息映射函式或處理函式沒有區別uj5u.com熱心網友回復:
從你的描述看是一個執行緒收并SendMessage 一個執行緒(視窗類)處理
接收執行緒收了包 Send的時候不會再去收下一個包(或是TCP協議會給你收了暫存等待你取用包,總之不涉及并發你的邏輯)
訊息本身的性質也決定 不管你視窗類中有多少種處理函式 他同時只處理一個訊息 不會出現一個視窗類 多執行緒在跑處理的情況
大概了解了。我的程式需要接收多個埠的資料,每個埠一個連接。都是采用這種接收->SEND->資料處理的方式。
還可以怎樣做能優化下效率嗎?我個人感覺,多執行緒除了防止界面假死外好像沒什么意義。反正都是一個核在跑...
還有一個問題,如果資料處理是在視窗類執行緒里處理的,界面咋沒死嘞
如果每個埠的通信不是不同的協議,實際上可以只開一個埠,服務器一般就是這么作業,1對多,然后你可根據連接進來的不同IP來區分每個客戶。
多執行緒可以充分利用多核CPU的,現在一般CPU都多核了,可以真實同時跑多個部分。如果網路并發量很大,可以像之前有人推薦的用IOCP,它可以只用幾個處理執行緒,減少太多執行緒背景關系切換帶來的開銷。
如果處理放在主界面的視窗類中,應該是每個處理都很快所以沒有察覺到卡住,可以試試在處理類中做個極費時的操作,界面應該會假死。
請問這種一個行程下的多個執行緒,能同時跑在不同的核上面嗎?我一直理解的是一個行程只能跑在一個核上面..
uj5u.com熱心網友回復:
從你的描述看是一個執行緒收并SendMessage 一個執行緒(視窗類)處理
接收執行緒收了包 Send的時候不會再去收下一個包(或是TCP協議會給你收了暫存等待你取用包,總之不涉及并發你的邏輯)
訊息本身的性質也決定 不管你視窗類中有多少種處理函式 他同時只處理一個訊息 不會出現一個視窗類 多執行緒在跑處理的情況
大概了解了。我的程式需要接收多個埠的資料,每個埠一個連接。都是采用這種接收->SEND->資料處理的方式。
還可以怎樣做能優化下效率嗎?我個人感覺,多執行緒除了防止界面假死外好像沒什么意義。反正都是一個核在跑...
還有一個問題,如果資料處理是在視窗類執行緒里處理的,界面咋沒死嘞
如果每個埠的通信不是不同的協議,實際上可以只開一個埠,服務器一般就是這么作業,1對多,然后你可根據連接進來的不同IP來區分每個客戶。
多執行緒可以充分利用多核CPU的,現在一般CPU都多核了,可以真實同時跑多個部分。如果網路并發量很大,可以像之前有人推薦的用IOCP,它可以只用幾個處理執行緒,減少太多執行緒背景關系切換帶來的開銷。
如果處理放在主界面的視窗類中,應該是每個處理都很快所以沒有察覺到卡住,可以試試在處理類中做個極費時的操作,界面應該會假死。
請問這種一個行程下的多個執行緒,能同時跑在不同的核上面嗎?我一直理解的是一個行程只能跑在一個核上面..
uj5u.com熱心網友回復:
視窗只是一個執行緒,但是你可以自己啟動多執行緒轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/16968.html
標籤:基礎類
下一篇:有沒有大佬會影像壓縮解壓的
