Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/91: Рейтинг темы: голосов - 91, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
1

EOSError 1400 "Недопустимый дескриптор окна"

21.06.2011, 09:05. Показов 18710. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
После того как перенес некоторый код в поток при завершении программы стала вылетать ошибка EOSError 1400 "Недопустимый дескриптор окна". Код программно помещает на форму некоторое количество некоторых компонентов(таких как tlabel, timage, tbutton итп). Когда код был вне потока все было нормально, причина появления ошибки мне совершенно не ясна т.к. код выполняется до конца без ошибок и по идее поток должен при этом завершаться.
Вот этот код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
procedure TNewThread.Execute;
begin
 
//Çàãðóæàåì äðóçåé
reply_friends:=Form1.HTTPAction('index.php?action=friends&login='+Login+'&pass='+Password);
 
if Pos('<error>', reply_friends) = 0 then begin
friends_count:=StrToInt(Pars('<count>',reply_friends,'<>'));
 
  for element_i2 := 0 to friends_count-1 do
  begin
    friend:=element_i2+1;
    friend_str:=IntToStr(friend);
    friend_id:=Pars('<start>'+friend_str+'<>',reply_friends,'<end>'+friend_str+'<>');
    element_i:=StrToInt(Pars('<id>',friend_id,'<>'));
  //Àâàòàðû
    avatars[element_i] := TImage.Create(nil);
    avatars[element_i].Width := 60;
    avatars[element_i].Height := 60;
    avatars[element_i].Left := 8;
    if element_i2 = 0 then avatars[element_i].Top := 8;
    if element_i2 > 0 then avatars[element_i].Top := 8+(8+avatars[element_i].Height)*element_i2;
    MS:= TMemoryStream.Create;
    PNG := TPNGObject.Create;
    Form1.HTTPActionMS('avatars/'+Pars('<id>',Pars('<start>'+friend_str+'<>',reply_friends,'<end>'+friend_str+'<>'),'<>')+'.png', MS);
    MS.Position := 0;
    PNG.LoadFromStream(MS);
    avatars[element_i].Picture.Assign(PNG);
    MS.Free;
    PNG.Free;
    avatars[element_i].Parent := sScrollBox1;
 
  //Íèê:
    el_nick1[element_i] := TsLabel.Create(nil);
    el_nick1[element_i].Left := 72;
    el_nick1[element_i].Caption := 'Íèê:';
    if element_i2 = 0 then el_nick1[element_i].Top := 8;
    if element_i2 > 0 then el_nick1[element_i].Top := 8+(8+60)*element_i2;
    el_nick1[element_i].Parent := sScrollBox1;
 
  //Íèê
    el_nick2[element_i] := TsLabel.Create(nil);
    el_nick2[element_i].Left := 120;
    el_nick2[element_i].Caption := Pars('<name>',friend_id,'<>');
    if element_i2 = 0 then el_nick2[element_i].Top := 8;
    if element_i2 > 0 then el_nick2[element_i].Top := 8+(8+60)*element_i2;
    el_nick2[element_i].Parent := sScrollBox1;
 
  //Ñòàòóñ:
    el_status1[element_i] := TsLabel.Create(nil);
    el_status1[element_i].Left := 72;
    el_status1[element_i].Caption := 'Ñòàòóñ:';
    if element_i2 = 0 then el_status1[element_i].Top := 24;
    if element_i2 > 0 then el_status1[element_i].Top := 24+(8+60)*element_i2;
    el_status1[element_i].Parent := sScrollBox1;
 
  //Ñòàòóñ
    el_status2[element_i] := TsLabel.Create(nil);
    el_status2[element_i].Left := 120;
    st:=StrToInt(Pars('<status>',friend_id,'<>'));
    if st=0 then el_status2[element_i].Caption := 'Â èãðå';
    if st=1 then el_status2[element_i].Caption := 'Â ñåòè';
    if st=2 then el_status2[element_i].Caption := 'Îòøåë';
    if st=3 then el_status2[element_i].Caption := 'Çàíÿò';
    if st=4 then el_status2[element_i].Caption := 'Îòêëþ÷åí îò ñåòè';
    if element_i2 = 0 then el_status2[element_i].Top := 24;
    if element_i2 > 0 then el_status2[element_i].Top := 24+(8+60)*element_i2;
    el_status2[element_i].Parent := sScrollBox1;
 
  //Èãðà:
    el_game1[element_i] := TsLabel.Create(nil);
    el_game1[element_i].Left := 72;
    el_game1[element_i].Caption := 'Èãðà:';
    if element_i2 = 0 then el_game1[element_i].Top := 40;
    if element_i2 > 0 then el_game1[element_i].Top := 40+(8+60)*element_i2;
    el_game1[element_i].Parent := sScrollBox1;
 
  //Èãðà
    el_game2[element_i] := TsLabel.Create(nil);
    el_game2[element_i].Left := 120;
    el_game2[element_i].Caption := Pars('<game>',friend_id,'<>');
    if element_i2 = 0 then el_game2[element_i].Top := 40;
    if element_i2 > 0 then el_game2[element_i].Top := 40+(8+60)*element_i2;
    el_game2[element_i].Parent := sScrollBox1;
 
  //Ñåðâåð:
    el_server1[element_i] := TsLabel.Create(nil);
    el_server1[element_i].Left := 72;
    el_server1[element_i].Caption := 'Ñåðâåð:';
    if element_i2 = 0 then el_server1[element_i].Top := 56;
    if element_i2 > 0 then el_server1[element_i].Top := 56+(8+60)*element_i2;
    el_server1[element_i].Parent := sScrollBox1;
 
  //Ñåðâåð
    el_server2[element_i] := TsLabel.Create(nil);
    el_server2[element_i].Left := 120;
    el_server2[element_i].Caption := Pars('<server>',friend_id,'<>');
    if element_i2 = 0 then el_server2[element_i].Top := 56;
    if element_i2 > 0 then el_server2[element_i].Top := 56+(8+60)*element_i2;
    el_server2[element_i].Parent := sScrollBox1;
 
  //Êíîïêà ìåíþ
    el_menu_btn[element_i] := TsButton.Create(form10);
    el_menu_btn[element_i].Left := 220;
    el_menu_btn[element_i].Caption := '^';
    el_menu_btn[element_i].Width := 17;
    el_menu_btn[element_i].Height := 17;
    el_menu_btn[element_i].Tag := StrToInt(Pars('<id>',friend_id,'<>'));
    el_menu_btn[element_i].OnClick:=Form10.onbtn;
    if element_i2 = 0 then el_menu_btn[element_i].Top := 8;
    if element_i2 > 0 then el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
    el_menu_btn[element_i].Parent := sScrollBox1;
 
  //ID
    el_id[element_i] := StrToInt(Pars('<id>',friend_id,'<>'));
 
  end;
 
sLabel1.Caption:='';
end
else
begin
sLabel1.Caption:=Pars('<error>',reply_friends,'<>');
end;
 
Form10.Loading_Anim.Visible:=false;
Form10.Loading_Anim.Animate:=false;
end;
Подскажите пожалуйста что в этом коде может вызывать эту ошибку?
Заранее спасибо.
P.S. Мб мысль глупая но всеже - а не может это быть из за того что если динамически создавать объекты в потоке то поток не завершиться после выполнения и будет продолжать жить пока эти объекты существуют?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2011, 09:05
Ответы с готовыми решениями:

Недопустимый дескриптор окна error 1400
Проблема в следующем: В отдельном потоке запускается обработка текстовых файлов на предмет поиска...

'System Error. Code: 1400. Недопустимый дескриптор окна'
Пишу многопоточную программу, а при ее закрытии после работы потоков выдает эту ошибку, из-за чего...

Недопустимый дескриптор окна =)
Все пашет вот только... Обьясняю))) В общем Основное Приложение вызывает SendPPMsg из DLL и все...

Дескриптор окна
Из за чего эта ошибка? И как ее исправить?

29
16 / 16 / 3
Регистрация: 14.06.2011
Сообщений: 64
21.06.2011, 09:16 2
Какая связь из Form10. Возможно при обращении к форме она не create.
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 09:49  [ТС] 3
Запуск потока происходит внутри той самой form10 по ее onshow т.ч. невозможно, полюс как я уже сказал код выполняется до конца без ошибок(я это проверил поставив в конец кода showmessage).

Добавлено через 29 минут
Нашел то что вызывает ошибку, эта строчка:
Delphi
1
el_menu_btn[element_i].Parent := sScrollBox1;
Но почему? У остальных компонентов родительским точно также является sScrollBox1...
0
16 / 16 / 3
Регистрация: 14.06.2011
Сообщений: 64
21.06.2011, 09:50 4
К компонентам которые динамически созданы обращаетесь не из потока?
Желательно бы увидеть код где запускается поток и что там еще делается.
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:04  [ТС] 5
Нет обращаюсь не из потока, код который выше привел это полный код этого потока. Запускается поток из onshow как я уже говорил, вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
procedure Tform10.FormShow(Sender: TObject);
begin
Button1.SetFocus;
Timer1.Enabled:=true;
 
//Çàãðóæàåì ñâîè äàííûå
sLabel3.Caption:=auth_name;
image1.Picture:=form2.avatar.picture;
sComboBox1.ItemIndex:=Form2.sComboBox1.ItemIndex;
if auth_gamed <> '1' then begin
sLabel2.Caption:='';
sLabel8.Caption:='';
end;
if auth_gamed = '1' then begin
sLabel2.Caption:='Íå îïðåäåëåíî';
sLabel8.Caption:='Íå îïðåäåëåíî';
end;
 
if last_update_friends < time then begin
  Loading_Anim.Animate:=true;
  Loading_Anim.Visible:=true;
  TNewThread.Create(false);
 
  last_update_friends:=time+(1/(24*3600))*15;
  
  //Óäàëÿåì âñå ýëåìåíòû
  sScrollBox1.Free;
 
//ScrollBox
  sScrollBox1 := TsScrollBox.Create(Form10);
  sScrollBox1.Left := 16;
  sScrollBox1.Top := 88;
  sScrollBox1.Width := 265;
  sScrollBox1.Height := 361;
  sScrollBox1.HorzScrollBar.Visible := false;
  sScrollBox1.VertScrollBar.ButtonSize := 5;
  sScrollBox1.AutoMouseWheel := true;
  sScrollBox1.TabOrder := 1;
  sScrollBox1.Parent := Form10.sPanel1;
 
//sLabel1
  sLabel1 := TsLabel.Create(Form10);
  sLabel1.Left := 8;
  sLabel1.Width := 3;
  sLabel1.Height := 13;
  sLabel1.Top := 8;
  sLabel1.Parent := sScrollBox1;
end;
end;
0
16 / 16 / 3
Регистрация: 14.06.2011
Сообщений: 64
21.06.2011, 10:16 6
Delphi
1
TNewThread.Create(false);
после
Delphi
1
2
3
4
5
6
7
8
9
10
sScrollBox1 := TsScrollBox.Create(Form10);
  sScrollBox1.Left := 16;
  sScrollBox1.Top := 88;
  sScrollBox1.Width := 265;
  sScrollBox1.Height := 361;
  sScrollBox1.HorzScrollBar.Visible := false;
  sScrollBox1.VertScrollBar.ButtonSize := 5;
  sScrollBox1.AutoMouseWheel := true;
  sScrollBox1.TabOrder := 1;
  sScrollBox1.Parent := Form10.sPanel1;
1
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:22 7
Ничего не пойму:
Delphi
1
2
3
4
5
6
TNewThread.Create(false);
 
  last_update_friends:=time+(1/(24*3600))*15;
  
  //Удаляем все элементы
  sScrollBox1.Free;
Тут что? Создаётся поток, и не известно, успеет он всё сделать, не успеет - всё равно sScrollBox1 сносим, а поток будет продолжать в несуществующий sScrollBox1 пихать компоненты?
Или я что-то путаю?
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:22  [ТС] 8
Ппц я и правда идиот... Странно что тут вообще чето работало... А еще странно то что это исправление ошибку не устранило. И еще один момент забыл написать - на форме все динамически созданные объекты показываются нормально, а вот эта злосчастная кнопка из за которой вылетает ошибка не показывается.
deathNC
да да я идиот xD хз каким волшебным образом но несморя на то что я такую глупую ошибку допустил он успевал xD но проблема все равно осталась после исправления этой глупой ошибки =\
Тут дело в том что открытие 10 формы предусмотрено не 1 разовое и данные там меняются, по этому при показе формы скорллбокс со всем содержимым стирается и создается заново если с момент последнего показа формы прошло более 15 секунд, вобщем я просто запуск потока поставил до абсурдности неправильно)
0
deathNC
21.06.2011, 10:26
  #9

Не по теме:

Crystallon, если при сносе компонентов через метод Free будет ошибка, то пробуй сносить через Destroy :)
Это просто на будущее :D

1
16 / 16 / 3
Регистрация: 14.06.2011
Сообщений: 64
21.06.2011, 10:26 10
Delphi
1
2
//Кнопка меню
    el_menu_btn[element_i] := TsButton.Create(form10);
на
Delphi
1
2
//Кнопка меню
    el_menu_btn[element_i] := TsButton.Create(nil);
1
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:28 11
А с этим проектом - отдельную процедуру писать, в которую перенести всё, что после запуска потока и запустить её по завершению потока. Это если другими путями не справишься!
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:30  [ТС] 12
Цитата Сообщение от MiheyJumaric Посмотреть сообщение
Delphi
1
2
//Кнопка меню
    el_menu_btn[element_i] := TsButton.Create(form10);
на
Delphi
1
2
//Кнопка меню
    el_menu_btn[element_i] := TsButton.Create(nil);
Уже пробовал, также пробовал всем остальным компонентам поставить form10 вместо nil, вообще ничего не меняется.

Цитата Сообщение от deathNC Посмотреть сообщение
А с этим проектом - отдельную процедуру писать, в которую перенести всё, что после запуска потока и запустить её по завершению потока. Это если другими путями не справишься!
Ды эт я понимаю, в том то и дело что там ничего не должно быть после запуска потока, я просто не туда его запуск поставил

А вообще это бред какойто...чем tbutton хуже других компонентов что приводит к такой проблеме...ведь его создание полностью аналогично созданию других компонентов...
0
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:35 13
Проверь индексы element_i и типы элементов. МОж не то что-то написал. А то поди el_menu_btn у тебя как TButton какой-нибудь объявлен, а создаёшь TSButton
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:36  [ТС] 14
Цитата Сообщение от deathNC Посмотреть сообщение
Проверь индексы element_i и типы элементов. МОж не то что-то написал. А то поди el_menu_btn у тебя как TButton какой-нибудь объявлен, а создаёшь TSButton
Это в первую очередь проверил, каждую строчку сверил =\
Плюс к тому я код просто скопировал из onshow, он раньше там был а не в потоке и нормально работал
И методом коментирования строчек и групп строчек я точно определил что если все оставить как есть и закомменить одну лишь строчку
Delphi
1
el_menu_btn[element_i].Parent := sScrollBox1;
ошибка уже не возникает, но кнопки на форме по прежнему отсутствуют, и еслиб они там были при этом то было бы очень странно)
0
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:45 15
Попробуй
Delphi
1
Form10.InsercControl([COLOR="DimGray"]<<<твой компонент>>>[/COLOR])ж
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:49  [ТС] 16
Цитата Сообщение от deathNC Посмотреть сообщение
Попробуй
Delphi
1
Form10.InsercControl([COLOR="DimGray"]<<<твой компонент>>>[/COLOR])ж
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
    el_menu_btn[element_i] := TsButton.Create(Form10);
    el_menu_btn[element_i].Left := 220;
    el_menu_btn[element_i].Caption := '^';
    el_menu_btn[element_i].Width := 17;
    el_menu_btn[element_i].Height := 17;
    el_menu_btn[element_i].Tag := StrToInt(Pars('<id>',friend_id,'<>'));
    el_menu_btn[element_i].OnClick:=Form10.onbtn;
    if element_i2 = 0 then el_menu_btn[element_i].Top := 8;
    if element_i2 > 0 then el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
    el_menu_btn[element_i].Parent := sScrollBox1;
 
    Form10.InsertControl(el_menu_btn[element_i]);
Ничего не изменилось =\
0
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:51 17
А
Delphi
1
el_menu_btn[element_i].Show;
если есть такое конечно
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:53  [ТС] 18
Есть) но все как было так и осталось =\
0
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
21.06.2011, 10:56 19
Это не относится к ошибке, но я не увидел смысла в первой строке и в условии второй:
Delphi
1
2
If element_i2 = 0 then el_menu_btn[element_i].Top := 8;
If element_i2 > 0 then el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
На мой взгляд:
Delphi
1
el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
1
1 / 1 / 0
Регистрация: 20.06.2011
Сообщений: 55
21.06.2011, 10:58  [ТС] 20
Цитата Сообщение от deathNC Посмотреть сообщение
Это не относится к ошибке, но я не увидел смысла в первой строке и в условии второй:
Delphi
1
2
If element_i2 = 0 then el_menu_btn[element_i].Top := 8;
If element_i2 > 0 then el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
На мой взгляд:
Delphi
1
el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
Эт сейчас неважно) главное работает xD все равно исправление таких "извращений" не даст заметного прироста в производительности)
0
21.06.2011, 10:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2011, 10:58
Помогаю со студенческими работами здесь

System Error. Code 1400. Недопустимый дескриптор окна
Вобщем такая проблема есть БД акссес и программа все рабоет но при закрытии программы выдает ошибку...

Недопустимый дескриптор окна
Добрый вечер уважаемые форумчане. Вопрос конечно изъезженный но все таки для себя решения я не смог...

Ошибка Exception EOSError in module .... System error. Code: 1400. Invalid window handle.
Доброе время суток! Я использовал поток в приложении CreateThread().. Примерно такая струкура...

EOSError 1400 “Недопустимый дескриптор окна”
Программа (назовём её My1.exe ) периодически обращается из потока к COM-порту. На компьютере есть...

Недопустимый дескриптор окна. (Обмен сообщениями: TCP)
Доброго времени суток. Есть программа, которая производит обмен сообщениями по сети между...

Недопустимый дескриптор окна, abnormal program termination
Есть две формы. На каждой есть Memo, chart и кнопка. По нажатию на кнопку(из любой формы)...

Нужно получить дескриптор окна имея дескриптор контрола
Нужно получить дескриптор окна имея дескриптор контрола, подскажите как


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru