...ing logging 4.0

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

DFL rev80 + dmd 2.031でリストボックスの選択済みアイテムが取得できない(4)

意味不明な方法で問題を回避することができた*1
結局,Win32APIを直接使っていて,DFLの方ではやっぱり動かない.
もしかしたらListBox周りのWin32 API特有の仕様なのだろうか.

import std.stdio;
import core.thread;
import dfl.all; // http://dsource.org/projects/bindings/wiki/WindowsApi
import dfl.internal.winapi;

class MyThread : Thread
{
	ListBox lb;
	this(ListBox lb)
	{
		this.lb = lb;
		super(&run);
	}
	private void run()
	{
		for(;;)
		{
			write("DFL: ", lb.selectedItems.length, "\t");
			
			int length = SendMessageA(lb.handle, LB_GETSELCOUNT, 0, 0);
			writeln("API: ", length);
			
			for(int i; i<100000000; ++i){}
		}
	}
}

void main()
{
	auto f = new Form;
	auto lb = new ListBox;
	lb.parent = f;
	lb.selectionMode = SelectionMode.MULTI_EXTENDED;
	lb.items.add("a");
	lb.items.add("b");
	lb.items.add("c");
	
	// 何でこれが必要なの???
	int dummy = SendMessageA(lb.handle, LB_GETSELCOUNT, 0, 0);
	
	(new MyThread(lb)).start();
	
	Application.run(f);
}

int dummy = ... の行があるときにはちゃんと SendMessageA から帰ってくる.
ところが,なぜかその行がないときには SendMessageA に入ったとたん2度と帰ってこなくなってしまい,コンソールには何も表示されない.
なぜだ・・・.


誰か教えてください><。

もしかして

スレッドの起動が早すぎるのかな?
Application.runの後に起動するようにしてみよう.

改良後

...
void main()
{
	auto f = new Form;
	auto lb = new ListBox;
	
	auto t = new MyThread(lb);
	
	lb.parent = f;
	lb.selectionMode = SelectionMode.MULTI_EXTENDED;
	lb.items.add("a");
	lb.items.add("b");
	lb.items.add("c");
	lb.click ~= (Object, EventArgs){
		t.start();
	};
	
	Application.run(f);
}

おお,これならSendMessageAの方は動いた.
DFLの方はどうしたらいいのかな.

*1:DFLだけでいいようにちょっと書き直しました.