...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

マルチスレッドプログラミングわかんねー(3)

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);
}

うーん.なんだこれは.帰ってから書き直そう.