|   |  
 
h-tom です。 
 
>>キーの入力検出で、思いっきりループさせている為、CPUが100%になっていると思い 
>>ます。 
>>田楽dllを使って負荷を軽減させることは可能かな? 
>具体的にどうすれば良いのか教えてもらえませんか? 
grepダイアログを開く事も含め、田楽DLLでループ時の負荷低減もおこないました。 
修正箇所は少ないですが、まとめて最期にのせます。 
 
田楽DLLは以下の場所から入手してください。 
 http://www.ceres.dti.ne.jp/~sugiura/ 
田楽DLLは、 
・マクロと同じ場所 
・マクロフォルダ 
・秀丸と同じフォルダ 
のいずれかに置いてください。 
 
キー待ち受けループ内にある 
    if(#dengaku) #n = dllfunc("SLEEP",100); 
にある、100を大きくしていくと、負荷が少なくなりますが、キー入力に対する 
反応は鈍くなります。環境に合わせて調整して下さい。 
 
//ビュアー機能付きGrep 
grepdialog; 
//キャンセル時は終了 
if(filetype == "new"){ 
    exit; 
    endmacro; 
} 
//デバック時は、以下の2行のコメントを外すこと 
//debuginfo 1; 
//#debug = 1; 
 
if(filetype != "grep"){ 
    message "grep 以外では実行できません。"; 
    endmacro; 
} 
 
//田楽DLLをロード 
#dengaku = 1; 
loaddll currentmacrodirectory + "\\dengakudll.dll"; 
if (!result) loaddll macrodir + "\\dengakudll.dll"; 
if (!result) loaddll "dengakudll.dll"; 
if (!result) #dengaku = 0; 
 
//検索関連の設定保護 
$BAK_SEARCHBUFFER  = searchbuffer; 
#BAK_SEARCHOPTION  = searchoption; 
#BAK_HILIGHTING    = foundhilighting; 
$BAK_REPLACEBUFFER = replacebuffer; 
if(#BAK_HILIGHTING) hilightfound 0; 
//メインgrep画面のハンドルを取得 
#main = hidemaruhandle(0); 
//検索のベースフォルダ 
$base = directory + "\\"; 
//秀丸の検索数 
#max = hidemarucount - 1; 
//マクロ終了時にビュアー画面を閉じない場合は1 閉じるなら0 
#view_close = 1; 
 
//メイン画面の座標、ウィンドウサイズを保存 
#pos_x = windowposx; 
#pos_y = windowposy; 
#width  = windowcx; 
#height = windowcy; 
 
//タブモードの場合はループの最大を変更 
if(tabmode) #max = tabgrouptotal - 1; 
 
//横に並べるを使う都合上、表示する秀丸以外は最小化する。 
//ウィンドウを並べないのなら不要なコード 
if(#max > 0){ 
    #cnt = 0; 
    while(#cnt < #max){ 
        if(tabmode == 0){ 
            #list[#cnt] = hidemaruhandle(#cnt + 1); 
        }else{ 
            #list[#cnt] = getcurrenttab( true, #cnt + 1); 
        } 
//        call DBOUT str(#cnt) + ":" + str(#list[#cnt]); 
        #cnt = #cnt + 1; 
    } 
    //起動した秀丸(grep)以外は最小化 
    #cnt = 0; 
    while(#cnt < #max){ 
        setactivehidemaru hidemaruhandle(#list[#cnt]); 
        showwindow 2; 
        #cnt = #cnt + 1; 
    } 
    setactivehidemaru #main; 
} 
 
//ビューア用の秀丸を開く 
call openview; 
//ウィンドウの並びを設定 
//ウィンドウの配置を変えたい場合、このルーチンを書き換えること。 
call set_window; 
//メインをアクティブ化 
setactivehidemaru #main; 
 
//grepの出力形式判定 
//フルパス(ネットワークドライブ)かどうか 
gofiletop; 
searchdown "\\(([0-9]+)\\):(?\\1)", regular; 
if(result){ 
    escape; 
    beginsel; 
    golinetop2; 
    $chk_name = gettext(seltopx, seltopy, selendx, selendy); 
    if(strstr($chk_name, ":\\") == 1 || leftstr($chk_name,2) == "\\\\") $bas 
e = ""; 
} 
//先頭の内容を表示 
title "grep View Mode [esc]で終了 grep " +  directory2 + "\\" + grepfilebuffer; 
gofiletop; 
#lineno = lineno; 
call grep_view; 
//ループでキー入力待ち受け 
disablebreak; 
while(1){ 
    #getkey = keypressed; 
    //[esc] 
    if(#getkey == 0x1b){ 
        setactivehidemaru #view; 
        if(result){ 
            //範囲選択、閲覧モードを解除 
            escape; 
            if(browsemode) browsemodeswitch; 
        } 
        break; 
    } 
    //[up] or [left] 
    if(#getkey == 0x26 || #getkey == 0x25) movetolineno column, lineno - 1; 
    //[down] or [right] 
    else if(#getkey == 0x28 || #getkey == 0x27) movetolineno column, lineno  
+ 1; 
    //[PageUp] 
    else if(#getkey == 0x21) halfprevpage; 
    //[PageDown] 
    else if(#getkey == 0x22) halfnextpage; 
    //[Enter] 動作しないと思う 
    else if(#getkey == 0x0D) #ret = 1; 
    //カーソル位置が変更されていればビューアを更新 
    if(#lineno != lineno || #ret == 1){ 
        call grep_view; 
        #lineno = lineno; 
    } 
    #ret = 0; 
    //田楽DLLがある場合、負荷低減の為、waitをかける。 
    if(#dengaku) #n = dllfunc("SLEEP",100); 
} 
 
//他のウィンドウを復元 
//ウィンドウを並べないなら不要なコード 
#cnt = #max - 1; 
while(#cnt > -1){ 
    setactivehidemaru hidemaruhandle(#list[#cnt]); 
    //念のため明示的に元に戻す 
    //showwindow 1; 
    #cnt = #cnt - 1; 
} 
 
//ビューア秀丸を復元? 
if(#view_close == 1){ 
    setactivehidemaru #view; 
    if(tabmode){ 
        settabgroup #view, #tg_id; 
    }else{ 
        setwindowpos #pos_x_1, #pos_y_1, #width_1, #height_1; 
    } 
}else{ 
    setactivehidemaru #main; 
    closehidemaruforced #view; 
} 
// 
setactivehidemaru #main; 
//田楽DLLの解放 
freedll; 
title 0; 
//座標、ウィンドウサイズを復元 
setwindowpos #pos_x, #pos_y, #width, #height; 
setsearch $BAK_SEARCHBUFFER, #BAK_SEARCHOPTION; 
setreplace $BAK_REPLACEBUFFER; 
if(#BAK_HILIGHTING) hilightfound 1; 
endmacro; 
 
//grepの結果から、ファイル名と行番号を取得し、ビューに表示 
//"finename(num): "を検索し、行番号とファイル名を取得し表示 
grep_view: 
    disabledraw; 
    golinetop2; 
    searchdown "\\(([0-9]+)\\):(?\\1)", regular; 
    if(result){ 
        #line = val(gettext(foundtopx, foundtopy, foundendx, foundendy)); 
        searchup "("; 
        if(result){ 
            escape; 
            beginsel; 
            golinetop2; 
            $fname = gettext(seltopx, seltopy, selendx, selendy); 
            enabledraw; 
            if(existfile($base + $fname) == 0){ 
                message "ファイルが見つかりません。\n" + $base + $fname; 
                return; 
            } 
            setactivehidemaru #view; 
            if(!result){ 
                //ビュー用の秀丸を開く 
                call openview; 
                //ウィンドウの並びを設定 
                call set_window; 
                #set_result = true; 
                $bak_fname = ""; 
                setactivehidemaru #view; 
            } 
            if($fname != $bak_fname){ 
                loadfile $base + $fname; 
                if(browsemode == 0) browsemodeswitch; 
            }else{ 
                escape; 
            } 
            movetolineno 0, #line; 
            selectline; 
            setactivehidemaru #main; 
            $bak_fname = $fname; 
        } 
    }else{ 
        enabledraw; 
    } 
return; 
 
//ビューア用の秀丸を開き、各種設定取得 
openview: 
    newfile; 
    #view = hidemaruhandle(0); 
    #pos_x_1 = windowposx; 
    #pos_y_1 = windowposy; 
    #width_1  = windowcx; 
    #height_1 = windowcy; 
    if(tabmode){ 
        #tg_id = tabgroup; 
        settabgroup #view, -1; 
    } 
return; 
 
//秀丸ウィンドウの表示設定 
set_window: 
    setactivehidemaru #main; 
     
    //横に並べる場合 
    windowhorz; 
     
    //縦に並べる場合 
    //windowvert 
     
    //現状の幅のまま、画面の上下に並べる 
//    ##set_hi = cyworkarea / 2; 
//    ##set_x = windowposx; 
//    ##set_w = windowcx; 
//    setwindowpos ##set_x, 0, ##set_w, ##set_hi; 
//    setactivehidemaru #view; 
//    setwindowpos ##set_x, ##set_hi, ##set_w, ##set_hi; 
    //現状の幅のまま、画面の上下に並べる 
 
    //現在のウィンドウの下に固定幅で配置 
//    ##set_hi = 350;    //ビュアー用秀丸の高さ指定 
//    ##set_y = windowposy; 
//    ##set_x = windowposx; 
//    ##set_w = windowcx; 
//    ##set_h = windowcy; 
//    //表示エリア外になる場合、メイン画面の位置を補正する。 
//    ##all_hi = windowposy + windowcy + ##set_hi; 
//    if(cyworkarea < ##all_hi){ 
//        ##set_y = windowposy - (##all_hi - cyworkarea); 
//        if(##set_y < 0){ 
//            ##set_h = ##set_h + ##set_y; 
//            ##set_y = 0; 
//        } 
//    } 
//    setwindowpos ##set_x, ##set_y, ##set_w, ##set_h; 
//    setactivehidemaru #view; 
//    setwindowpos ##set_x, ##set_y + ##set_h, ##set_w, ##set_hi; 
    //現在のウィンドウの下に固定幅で配置 
     
    // 
    setactivehidemaru #main; 
return; 
 
//----------------------// 
//  デバック出力ルーチン 
//  デバックツールは「DBCon」等を使用する事 
//「http://www.htosh.com/」 
//----------------------// 
DBOUT: 
    if(#debug == 1 && findwindowclass("DBConClass") != 0) debuginfo $$1 + "\n"; 
return; 
 
			 | 
		  
	 |