Visual Studio6です。
ON_WM_TIMERより高速なEventはないのでしょうか?
ON_WM_TIMER()より高速なメッセージ
-
Gammodler1
Re: ON_WM_TIMER()より高速なメッセージ
済みません。途中で投稿になってしまいました。
受信専用スレッドで受けたデータを
::PostMessage(pView->hWnd, WM_USER_RCVSTS, (WPARAM)buf, 0);
でpViewスレッドに送付、OnRcvSts()を利用しているのですがUpdateに非常に時間がかかっています。1sec弱の感じです。
これを一桁以上高速にするON_WM_TIMER()に代わるメッセージ、Eventはないのでしょうか?。
舌足らずかもしれませんがよろしくお願いいたします。
受信専用スレッドで受けたデータを
::PostMessage(pView->hWnd, WM_USER_RCVSTS, (WPARAM)buf, 0);
でpViewスレッドに送付、OnRcvSts()を利用しているのですがUpdateに非常に時間がかかっています。1sec弱の感じです。
これを一桁以上高速にするON_WM_TIMER()に代わるメッセージ、Eventはないのでしょうか?。
舌足らずかもしれませんがよろしくお願いいたします。
Re: ON_WM_TIMER()より高速なメッセージ
その前にOnRcvSts()関数で1secかかっている、ということはありませんか?
一応念のため。GetTickCount関数を使って、時間を測定してみてください。
あるいはソースを掲示すると、識者から何か教えてくれるかもしれません。
とゆーか、連続でやりたいなら繰り返しSendMessageすればいい。
PostMessageはメッセージキューに送って、あとはOSに任せるやり方だから、思い通りにはいかんでしょ
プロセスかスレッドの優先度を高くするくらいしか…
一応念のため。GetTickCount関数を使って、時間を測定してみてください。
あるいはソースを掲示すると、識者から何か教えてくれるかもしれません。
そんなものないGammodler1 さんが書きました:これを一桁以上高速にするON_WM_TIMER()に代わるメッセージ、Eventはないのでしょうか?。
とゆーか、連続でやりたいなら繰り返しSendMessageすればいい。
PostMessageはメッセージキューに送って、あとはOSに任せるやり方だから、思い通りにはいかんでしょ
プロセスかスレッドの優先度を高くするくらいしか…
written by へにっくす
Re: ON_WM_TIMER()より高速なメッセージ
求めているのはこれでしょうか?
http://www.every-little.com/tips/active ... imer.xhtml
timeSetEvent関数
http://msdn.microsoft.com/ja-jp/library/cc428796.aspx
timeKillEvent関数
http://msdn.microsoft.com/ja-jp/library/dd757630.aspx
http://www.every-little.com/tips/active ... imer.xhtml
timeSetEvent関数
http://msdn.microsoft.com/ja-jp/library/cc428796.aspx
timeKillEvent関数
http://msdn.microsoft.com/ja-jp/library/dd757630.aspx
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ON_WM_TIMER()より高速なメッセージ
MFCだと思いますがメッセージを処理して貰うのは別のメッセージ処理が終わってからですので、へにっくすさんの言われる通りOnRcvSts()関数が長かったら何も出来ないと思います。その場合は、OnRcvSts()関数の処理時間が長い事自体問題なので、そこはスレッドに変えてもらうなどの処置が必要でしょう。
専有さえなければWM_TIMERなら100ms周期ぐらいでなら揺らぎがあるとは思いますが十分に可能だと思います。
専有さえなければWM_TIMERなら100ms周期ぐらいでなら揺らぎがあるとは思いますが十分に可能だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gammodler1
Re: ON_WM_TIMER()より高速なメッセージ
へにっくす様 みけCAT様 softya様
Resありがとうございました。
OnRcvSts()の実行時間はGetTickCount関数で測定できていないのですが、負荷の重さは当然、この問題に影響します。内容としてはEdit Box 8桁X15個、ボタンのONOFF表示5個など多少高負荷ではありますが、これらを次々に外して行ってみたのですが結果にはほとんど影響がみられません。
以前ほぼ同じ内容でスレッドを用いず、OnTimerで実行していた時は十分高速に表示できていました。ただsetTimer、killTimerを随所に入れなければならないので使い勝手が悪く、なんとか受信専用スレッド方式で行きたいと思っています。
postMessageをsendMessageに変更もしてみたのですが不調でした。
なおこの信号源はLinuxマシンでソケット経由で受信しています。
受信スレッド:
PostMeesageをsendMeesageに変更してみたのですが、相手先のLinuxが暴走するなどの弊害がありました。
示唆いただけることがあればお願いいたします。
Resありがとうございました。
OnRcvSts()の実行時間はGetTickCount関数で測定できていないのですが、負荷の重さは当然、この問題に影響します。内容としてはEdit Box 8桁X15個、ボタンのONOFF表示5個など多少高負荷ではありますが、これらを次々に外して行ってみたのですが結果にはほとんど影響がみられません。
以前ほぼ同じ内容でスレッドを用いず、OnTimerで実行していた時は十分高速に表示できていました。ただsetTimer、killTimerを随所に入れなければならないので使い勝手が悪く、なんとか受信専用スレッド方式で行きたいと思っています。
postMessageをsendMessageに変更もしてみたのですが不調でした。
なおこの信号源はLinuxマシンでソケット経由で受信しています。
受信スレッド:
static UINT doBeginMonitorDevThread( LPVOID pParam ) // スレッド制御関数
{
int nBytesRecv;
char buf[STSSENDSIZE];
while(monitorDev_FlagExitThread == TRUE){
nBytesRecv = recv(socket, buf, sizeof(buf), 0); // Client機能で受信
if(nBytesRecv == SOCKET_ERROR){
monitorDev_FlagExitThread = FALSE;
break;
}
// 文字列のままメインスレッドへ
::PostMessage(pView->hWnd, WM_USER_RCVSTS, (WPARAM)buf, 0);
}
return 0;
}
PostMeesageをsendMeesageに変更してみたのですが、相手先のLinuxが暴走するなどの弊害がありました。
LRESULT ::OnRcvSts(WPARAM wParam, LPARAM lParam)
{
int i;
char reg2Str[1 2][REGL];
char *stsStr = (char *)wParam;
char stsStrBuf[REGL + 1];
unsigned long reg2[20];
stsStrBuf[REGL] = '\0';
// 文字列に分割して受信。数値に変換
for (i = 0; i < 1 2; i++){
memcpy(reg2Str[i], stsStr + REGL * i ,REGL);
strcpy(stsStrBuf, reg2Str[i]);
stsStrBuf[REGL] = '\0';
reg2[i] = strtoul(stsStrBuf, NULL, 16); // 数値化する
}
dispFirmStatus(reg2Str, reg2); // EditBox, Button 外しても効果なし
ptRead = strtoul(reg2Str[10], NULL, 16); // 外しても効果なし
DoEvents(); // 下記
return(0);
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: ON_WM_TIMER()より高速なメッセージ
スレッドが全力でループしていた場合もメインのWM_TIMERは遅延します。
スレッドにSleep(500);とかを入れて改善するならスレッドが原因でしょう。
スレッドにSleep(500);とかを入れて改善するならスレッドが原因でしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
Gammodler1
Re: ON_WM_TIMER()より高速なメッセージ
softya様
どうやらON_WM_TIMER()の周期が仕様に合わないということが基本的な問題であることが分かりました。
受信スレッドは使用しますが、messageは発行しない方式でやり直すことにしました。
ありがとうございました。
どうやらON_WM_TIMER()の周期が仕様に合わないということが基本的な問題であることが分かりました。
受信スレッドは使用しますが、messageは発行しない方式でやり直すことにしました。
ありがとうございました。