http://sakura.qp.land.to/?BugReport%2F113
skrw_fix_macro_sleep_v2.patch ダイアログの破棄までメッセージループが回るように修正しました。 CDlgCancelのメモリーリーク修正
・リソースリークの修正 ・SleepをWaitForSingleObjectに変更 ・待機時間「0」以下のときは、スレッドを作成しないように。
pcDlgCancel->IsCanceled()は、WM_CLOSEすると必ずtrueなので、少し変更。 https://sourceforge.net/p/sakura-editor/patchunicode/425/ と、2chコメントをもとにさらに修正 GetMessege -> while(PeekMessage)に修正(ダイアログの表示がおかしいのを修正)
ds14050さんの http://vvvvvv.sakura.ne.jp/cgi_file/ds14050/diary/201304/16/improve_wsh_macro.patch から Parser->ParseScriptText(); if (hr == SCRIPT_E_REPORTED) {...}else を取り込みました。 Eventを無名にしました。
美的なことなのですが……
if(dwResult == WAIT_OBJECT_0){ }else if(dwResult != WAIT_OBJECT_0+1){ }else{
は理解が難しいので、節と条件を入れ替えて
if(dwResult == WAIT_OBJECT_0){ }else if(dwResult == WAIT_OBJECT_0+1){ }else{
にしませんか?
メインスレッドで sThreadParam.pEngine = NULL;
中断スレッドで if( p ){ DEBUG_TRACE(_T("AbortMacro: Try Interrupt\n")); p->InterruptScriptThread(SCRIPTTHREADID_BASE, NULL, 0); DEBUG_TRACE(_T("AbortMacro: Done\n")); }
していますがこのチェックはマルチスレッドでは無意味ではないですか? sThreadParam.pEngine = NULL; しなくても、マクロ実行中・実行終了後関係なく p->InterruptScriptThread(SCRIPTTHREADID_BASE, NULL, 0); してしまっても、(JScriptでは)問題ないのではないでしょうか。
指摘された2点修正しました。
昨日から間違えてばかりですが……
このチェックはマルチスレッドでは無意味ではないですか?
というコメントはコードを正しく理解したうえでのものではありませんでした。すみません。
sThreadParam.pEngine = NULL; -----------↑別スレッド↓------------------------- if( p ){ p->InterruptScriptThread(SCRIPTTHREADID_BASE, NULL, 0); }
というコードは、ぬるぽを起こすものではないのはもちろん、マクロ実行終了後の InterruptScriptThread呼び出しを(確実に)ブロックするものでもありませんが、不必要なInterruptScriptThread呼び出しを節約するものではありそうです。自分の環境ではキー入力のリピート速度を最速にしてマクロを連続実行してもキー入力が律速していましたので、あえて行数を費やして節約する必要はないのかなあ(v6パッチでいきましょう)という結論です。
[r2881]でコミットしました。
Commit: [r2881]
Log in to post a comment.
skrw_fix_macro_sleep_v2.patch
ダイアログの破棄までメッセージループが回るように修正しました。
CDlgCancelのメモリーリーク修正
・リソースリークの修正
・SleepをWaitForSingleObjectに変更
・待機時間「0」以下のときは、スレッドを作成しないように。
pcDlgCancel->IsCanceled()は、WM_CLOSEすると必ずtrueなので、少し変更。
https://sourceforge.net/p/sakura-editor/patchunicode/425/
と、2chコメントをもとにさらに修正
GetMessege -> while(PeekMessage)に修正(ダイアログの表示がおかしいのを修正)
ds14050さんの
http://vvvvvv.sakura.ne.jp/cgi_file/ds14050/diary/201304/16/improve_wsh_macro.patch
から
Parser->ParseScriptText();
if (hr == SCRIPT_E_REPORTED) {...}else
を取り込みました。
Eventを無名にしました。
美的なことなのですが……
if(dwResult == WAIT_OBJECT_0){
}else if(dwResult != WAIT_OBJECT_0+1){
}else{
は理解が難しいので、節と条件を入れ替えて
if(dwResult == WAIT_OBJECT_0){
}else if(dwResult == WAIT_OBJECT_0+1){
}else{
にしませんか?
Last edit: ds14050 2013-04-17
メインスレッドで
sThreadParam.pEngine = NULL;
中断スレッドで
if( p ){
DEBUG_TRACE(_T("AbortMacro: Try Interrupt\n"));
p->InterruptScriptThread(SCRIPTTHREADID_BASE, NULL, 0);
DEBUG_TRACE(_T("AbortMacro: Done\n"));
}
していますがこのチェックはマルチスレッドでは無意味ではないですか?
sThreadParam.pEngine = NULL;
しなくても、マクロ実行中・実行終了後関係なく
p->InterruptScriptThread(SCRIPTTHREADID_BASE, NULL, 0);
してしまっても、(JScriptでは)問題ないのではないでしょうか。
指摘された2点修正しました。
昨日から間違えてばかりですが……
というコメントはコードを正しく理解したうえでのものではありませんでした。すみません。
sThreadParam.pEngine = NULL;
-----------↑別スレッド↓-------------------------
if( p ){
p->InterruptScriptThread(SCRIPTTHREADID_BASE, NULL, 0);
}
というコードは、ぬるぽを起こすものではないのはもちろん、マクロ実行終了後の InterruptScriptThread呼び出しを(確実に)ブロックするものでもありませんが、不必要なInterruptScriptThread呼び出しを節約するものではありそうです。自分の環境ではキー入力のリピート速度を最速にしてマクロを連続実行してもキー入力が律速していましたので、あえて行数を費やして節約する必要はないのかなあ(v6パッチでいきましょう)という結論です。
Last edit: ds14050 2013-04-17
[r2881]でコミットしました。
Related
Commit: [r2881]