- PR -

Formアプリケーションが応答を返さない

1
投稿者投稿内容
すがわら
会議室デビュー日: 2004/03/22
投稿数: 3
投稿日時: 2007-03-19 02:39
VC++.NET 2003、.NET Framework1.1、WinXPにて開発しております。
Windowsフォームアプリケーションでの質問です。

起動時にFormがきちんと表示されず、白画面になり、
アプリケーションが応答しなくなることがあるのですが(うまくいくこともある)、
どうすればいいでしょうか?

ちなみに、直接exeから起動する場合は正常に表示されるのですが、
Javaで作成されたGUIから下記のように呼び出されると応答しなくなることが多いようです。
Runtime.getRuntime().exe(“xxx”);

起動時は、Form内のimageに周期的に書き込むために、
Form内でスレッド(delegate)を生成し、そこで100ms間隔でループさせ、
Invokeにてメインスレッドにのせかえ、
Form内のimageに書き込む処理を行います。
( .NETのSystem.Windows.Forms.Timerには、下記の障害が報告されているため、
http://support.microsoft.com/default.aspx?scid=kb;ja;890344
Formにタイマ相当の処理を作りました。
FormにSystem.Windows.Forms.Timer変数を用意し実装していたときも、白画面の現象は起きていました。)

コードについては、簡単に書くと、下記のような感じです。

int _tWinMain(){
Form1* form1 = new Form1();
form1->init();
Application::Run(form1);
return 0;
}

public class Form1: From{
From1(){
InitializeComponent();
}
void InitializeComponent(){
// ボタン、イメージ等の初期化
 ・・・・
}
void init(){
//デリゲートにてHandleTimer();よびだし
HandleTimerDelegate* handleTimerDelegate = new HandleTimerDelegate(this,HandleTimer);
AsyncCallback* myCallBack = new AsyncCallback( this,CallEndInvoke );
handleTimerDelegate->BeginInvoke( myCallBack,NULL );
}

void CalEndInvoke( IAsyncResult* ar ){
handleTimerDelegate->EndInvoke( ar );
}
__delegate void HandleTimerDelegate();
__delegate void PaintDelegate();

void HandleTimer() { // タイマ処理
PaintDelegate* paintDelegate = new PaintDelegate(this,Paint);
while( true ) {
   paintDelegate->Invoke();
  Thread::Sleep(100);
}
}
void paint() {
//Form内のイメージに書き込む
 ・・・・
}
}

よろしくお願いします。



[ メッセージ編集済み 編集者: すがわら 編集日時 2007-03-20 07:16 ]
すがわら
会議室デビュー日: 2004/03/22
投稿数: 3
投稿日時: 2007-03-26 01:43
自己レスです。

実行環境では、
.NET Framework1.1と.NET Framework2.0が共存していることがわかりました。
基本的に、ビルド環境と同じバージョンのFrameworkで動作するはずと思うのですが、
Runtime.getRuntime().exec(“xxx”);
のように動かすことで
何か動作に違いが生じるのでしょうか?

未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-03-26 15:59
バージョン動作については参考の下のほうに書いてあります。

取り合えずソースをど〜んと乗せるのではなく、シングルステップでコンソール出力いれたりしてみて、何処で止まってるか調べて見てはいかがでしょうか?
すがわら
会議室デビュー日: 2004/03/22
投稿数: 3
投稿日時: 2007-04-04 00:04
返信どうもありがとうございます。

現象が再現する環境でデバッグできなかったので、
質問していた次第です。

開発環境で再現し、調べたところ、
Form1* form1 = new Form1();

form1->init();
の間の部分で、スレッドを起こしており、
スレッド内で標準入力を受け取るような仕組みになっておりました。

そこで標準入力待ちとなり、
Formの表示にも影響がでていたようです。

標準入力の受付部は別スレッドだったので疑っていなかったのですが、
Formの初期化が行われるまではあまりいろいろさせるべきではないのかもしれませんね。。

どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)