import dfl.all; import dfl.internal.winapi; import std.cstream; import core.thread; shared bool startFlag; // trueでcollectorが仕事を始める shared bool restartFlag; // trueでcollectorが仕事を最初からやり直す shared bool endFlag; // trueでcollectorを終了する class MyForm : Form { this() { click ~= &onClick; doubleClick ~= &onDoubleClick; } void onClick(Object, EventArgs) { if (startFlag) { //まだcollectorが仕事を終えていないのでキャンセルして最初から restartFlag = true; } else { startFlag = true; // collectorに仕事をさせる } }; void onDoubleClick(Object, EventArgs) { endFlag = true; close(); } } void main() { auto f = new MyForm; auto worker = new Thread( { while(!endFlag) { if(startFlag) { RESTART: for(int i=0; i<1000000000; ++i)//重い処理 { if (restartFlag) { f.text = "";// ワーカースレッドにやらせると色々まずいと聞いたがinvokeの出番なのか? dout.writefln("restart"); dout.flush(); restartFlag = false; goto RESTART; } } f.text = f.text ~ "A"; // ワーカースレ(ry startFlag = false; } else { Sleep(100); } } }); worker.start(); Application.run(f); }
うーん.なんだこれは.帰ってから書き直そう.