Подтвердить что ты не робот

Возможные причины "EOSError 1400 - Недопустимый дескриптор окна"

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

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

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

Спасибо inb4


ANSWER

Эта ошибка произошла со мной, когда был вызван метод 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 necessary to use Synchronize()
    (...)
  end;
end;
4b9b3361

Ответ 1

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

Ответ 2

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

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

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