Возможные причины "EOSError 1400 - Неверный дескриптор окна" - PullRequest
12 голосов
/ 15 июня 2011

У меня проблема.У меня есть приложение VCL, используя поток.Этот поток выполняет некоторые вычисления и вызывает метод MainForm через Synchronize ().Все работает отлично, у меня есть кнопка «Пуск», которая создает и запускает поток, и кнопка «Стоп», которая останавливает и освобождает его.Нет ошибок, нет ничего.

Но по какой-то причине, когда я закрываю приложение и Я запускаю поток , я получаю EOSError 1400 - Invalid window handle.Я остановил процедуру OnClose, и единственное, что я там делаю, - это сохранение ini-файла, в этом нет ошибки. Когда я продолжаю трассировку (используя F7), я получаю до самого конца (Application.Run; end.) после «вызова».end. Я получаю сообщение об ошибке, поэтому нет конкретной строки кода, вызывающей ее.

Я надеюсь, что вопрос несколько ясен, и я надеюсь, что это разрешимо, потому что просто игнорирование ошибки кажется немного нечистым.

Спасибо inb4


ОТВЕТ

Эта ошибка произошла со мной, когда был вызван метод Execute потока, он выглядел так:

procedure TRunThread.Execute;
var (...)
begin
  while not Terminated do begin
    (...)
    MainForm.Memo1.Lines.Add('Some text'); // Even though this call worked fine during
    //the application running, it caused errors on shutting the app down.
    // For acccessing GUI elements, it's necessary to use Synchronize()
    (...)
  end;
end;

Ответы [ 2 ]

12 голосов
/ 15 июня 2011

Возможная причина - некоторый несинхронизированный доступ к GUI из потока. Вы сказали, что поток этого не делает, но не видит исходный код TRunThread.Execute, который выглядит как лучшая догадка.

0 голосов
/ 20 июля 2017

У меня была такая же проблема, код ошибки 5 Access is denied. Оказалось, что это связано с темой, которая начала тестировать интернет-соединение на встроенной панели (используя BeginThread). Если пользователь выходит из формы (которая проверяет подключение к Интернету) сразу после отображения формы, происходит AV.

На моем ПК для разработки тестирование интернет-соединения прошло успешно ... и так быстро, что я никогда не видел проблемы! После нескольких часов борьбы я, наконец, отследил его до этой темы и воспроизвел, отсоединив сетевой кабель.

Решение было простым: при выходе из формы (например, в событии FormDestroy) убедитесь, что поток определенно не запущен, прежде чем продолжить.

...