Возможные причины "EOSError 1400 - Неверный дескриптор окна"
У меня проблема. У меня есть приложение 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 ответа
Возможная причина - некоторый несинхронизированный доступ к GUI из потока. Вы сказали, что нить не делает этого, но не видя TRunThread.Execute
исходный код, который выглядит как лучшая догадка.
У меня была такая же проблема, код ошибки 5 Access is denied
, Это оказалось связано с темой, которая начала тестировать интернет-соединение на встроенной панели (используя BeginThread
). Если пользователь выходит из формы (которая проверяет подключение к Интернету) сразу после отображения формы, происходит AV.
На моем ПК для разработки тестирование интернет-соединения прошло успешно... и так быстро, что я никогда не видел проблемы! После нескольких часов борьбы я, наконец, отследил его до этой темы и воспроизвел, отсоединив сетевой кабель.
Решение было простым: при выходе из формы (например, в FormDestroy
событие) убедитесь, что поток определенно не работает, прежде чем продолжить.