意味不明な方法で問題を回避することができた*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だけでいいようにちょっと書き直しました.