←HSPハック トップへ

マルチスレッド

HSPでマルチスレッドを実装します。実用性には耐えがたいものですので、こういうのもあるんだなぁ~の感覚で読んで頂けるとうれしいです。

最終更新:2017/11/19

初版:2017/11/19




はじめに


マルチスレッドとは、複数の処理を並行して行うことです。要は、アプリケーション内でマルチタスクみたいな処理を行うことです。 これをHSPで実装してみたいと思います。

※ちょくと氏のhscallbk.dllが必要です。

スレッドを作る


CreateThread 関数でスレッドを作成します。
HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  DWORD dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId
);
lpThreadAttributes には、セキュリティ属性構造体へのポインタを指定しますが、NULLでかまいません。
dwStackSize には、新しく作るスレッドのスタックのサイズ(byte)を指定します。0で既定値が使用されます。
lpStartAddress には、LPTHREAD_START_ROUTINE型の関数の実行開始アドレスを指定します。実行させる関数はコールバック関数とは違うものですが、 HSPにはそれに対応した関数を作る機能がないので、hscallbk.dll を使用したコールバック関数を使用します。

lpParameter には、スレッドに渡す値を指定します。
dwCreationFlags には、スレッド作成に関する制御フラグを指定します。
意味
0(0x00000000)スレッド作成と同時にそのスレッドを実行します
CREATE_SUSPENDED(0x00000004)スレッドは中断された状態で作成されます。ResumeThread 関数を呼び出すまで動作しません。


lpThreadId には、1 個の変数へのポインタを指定します。関数から制御が返ると、この変数にスレッド識別子が格納されます。

スレッドを作る


hscallbk.dll を使って関数を作成し、新しいスレッドとして実行させます。
強引な手法なので終了時にランタイムエラーが発生したり、一部の命令が使用できなかったりと、不安定な部分が多いです。

下のサンプルは、2つ同時にメッセージボックスを表示させるものです。
#include "hscallbk.as"
#include "user32.as"
#include "kernel32.as"
#uselib ""
#func MyThreadProc "" int
setcallbk cMyThreadProc1, MyThreadProc, *MyThreadProc1
setcallbk cMyThreadProc2, MyThreadProc, *MyThreadProc2

mes "スレッド1作成した。"
CreateThread 0, 0, varptr(cMyThreadProc1), hwnd, 0, 0//サブスレッド1作成
mes "スレッド1作成関数終わった。"

mes "スレッド2作成した。"
CreateThread 0, 0, varptr(cMyThreadProc2), hwnd, 0, 0//サブスレッド2作成
mes "スレッド2作成関数終わった。"
stop

*MyThreadProc1//サブスレッド1
	vdParam=callbkarg(0)
	MessageBox vdParam, "サブスレッド1", "hoge", 0x10
return

*MyThreadProc2//サブスレッド2
	vdParam=callbkarg(0)
	MessageBox vdParam, "サブスレッド2", "hoge", 0x10
return




[前へ] [戻る] [次へ]

(C)2019 inonote / 無断転載禁止