0

約10個のウィンドウを持つDelphi7プロジェクトがあります。メインウィンドウは、プログラムの起動時にロードされます。しばらくすると、MainWindowはプロジェクトの別のウィンドウにアクセスしてリストビューアイテムを追加し、約1〜2秒ごとに更新します。ただし、このウィンドウはフリーズしているようで、開いた後はリストビューがまったく表示されません。

MainWindowのOnS​​howプロシージャに次のコマンドがある場合、これは機能します。

SecondWindow.Show;
SecondWindow.Close;

問題なく動作しますが、専門家ではないようです。表示されずにウィンドウを描画する方法についてのアイデアはありますか?

編集:コード(私はIndy9を使用しています)

procedure TMainWindow.ServerSocketExecute(AThread: TIdPeerThread);
begin
 /....
 if Buffer = 'additem' then begin
    Window2.ListView1.Items.Add;
    Exit;
    // .....
 end;
end;

それでおしまい。Window2からすべてのタイマーを削除しましたが、まだフリーズしているようです。アイテムが追加されるか、2番目のウィンドウを初めて開こうとすると、mainWindowがすぐにフリーズします。

4

1 に答える 1

6

問題は、メインGUIスレッドの外部、つまりTMainWindow.ServerSocketExecuteでVCLメソッドを呼び出していることです。このイベントはワーカースレッドで実行されます。ワーカースレッドからVCL/GUIコードを呼び出すことは、単にゲームのルールに反します。すべてのVCLコードは、メインGUIスレッドで実行する必要があります。

したがって、すべてのVCL/GUIコードがGUIスレッドで実行されることを確認して問題を解決してください。これを実現するには、TIdPeerThread.Synchronize()メソッド、またはTIdSyncまたはTIdNotifyクラスを使用します。

私が知らなかった詳細を提供してくれた@Remyに感謝します。

于 2012-04-21T23:22:38.950 に答える