Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа в потоке с формой 
:(
    Опции темы
Albinos_x
Дата 28.12.2005, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



в общем делаю так:
Код
...
procedure TForm1.SpeedButton5Click(Sender: TObject);
var h:THandle;
    hh:Dword;
begin
Timer1.Enabled:=true;
h:=CreateThread(nil,0,@CryptPack,nil,0,hh);
...
end;

Procedure CryptPack;
var i,j:word;
    pas:string;
begin
form1.ListBox1.Clear;
SetLength(TypFile,0);
RecTabAddFull(form1.DirectoryListBox1.Directory,TypFile);
i:=Length(TypFile);
for j:=0 to i-1 do
   begin
   form1.ListBox1.Items.Add(TypFile[j].rtFileName)
   end;
pas:=form1.Edit1.Text;
if not RecordFileC(form1.DirectoryListBox2.Directory+'\Test.chid', pas,TypFile) then
  MessageDlg('произошла ошибка. Файл не создан.',mtError,[mbOK],0)
  else
  MessageDlg('Файл создан.',mtInformation,[mbOK],0);
form1.edit1.text:='';                             // <- здесь ошибка : Canvas does not allow drawing и MessageDlg не показывается
form1.Timer1.Enabled:=false;
form1.ListBox2.Items.Add('Complit/')
end;
...


если не делать через поток, то всё работает нормально. и самое интересное что если сделать так:

Код
...
pas:=form1.Edit1.Text;
form1.edit1.text:='';
if not RecordFileC(form1.DirectoryListBox2.Directory+'\Test.chid', pas,TypFile) then
  MessageDlg('произошла ошибка. Файл не создан.',mtError,[mbOK],0)
  else
  MessageDlg('Файл создан.',mtInformation,[mbOK],0);
form1.Timer1.Enabled:=false;
...

то ошибка вылетает на form1.Timer1.Enabled:=false; При чём при пошаговой отладке эта ошибка не вылетает(?). Файл во всех случаях создаётся.

Объясните плз, в чём я не прав...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Albinos_x
Дата 29.12.2005, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



я тут порылся в коде... MessageDlg не вылетает потому что на нём и вылетает ошибка... если эти строчки убрать то уже ошибка не вылетает...
может есть ещё способ как вывести из потока сообщение о завершении работы процедуры?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Snowy
Дата 29.12.2005, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



MessageBox(0, 'Я всё', 'Поток', MB_OK);
Добавлено @ 00:14
Код

MessageBox(0, 'Файл не создан.', 'Ошиппка', MB_OK or MB_ICONERROR);
MessageBox(0, 'Файл создан.', 'Усё Ok!', MB_OK or MB_ICONINFORMATION);

PM MAIL   Вверх
Albinos_x
Дата 29.12.2005, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



СПАСИБО! smile
Всё работает...
поясни пожалуйста, почему MessageDlg не хотел работать?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Snowy
Дата 29.12.2005, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Потому что MessageDlg принадлежит Application.
Поэтому тебе нельзя юзать user объекты основного потока.
А MessageBox - чистый WinAPI. Он никому не принадлежит.
Но работать с классами из вторичного потоко не рекомендуется -
будут накладки основного и вторичного потока.
Особенно, если таких потоков много.
Например form1.ListBox1.Items.Add(TypFile[j].rtFileName).
Если он одновременно будет вызван из двух потоков, то лажа получится.
Поэтому по всем правилам рекомендуется работать с визуальными компонентами только в синхронизации.
PM MAIL   Вверх
Albinos_x
Дата 29.12.2005, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



ясно...

Цитата(Snowy @ 29.12.2005, 00:34)
Например form1.ListBox1.Items.Add(TypFile[j].rtFileName).
Если он одновременно будет вызван из двух потоков, то лажа получится.

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

еще раз СПАСИБО! smile


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Демо
Дата 29.12.2005, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Albinos_x @ 29.12.2005, 01:43)
а так я буду блокировать вызов ещё одного потока, пока этот не закончит работать...


Нельзя работать в дополнительном потоке с формами. Ни в каком виде.


--------------------
    
PM MAIL ICQ Skype   Вверх
Albinos_x
Дата 29.12.2005, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата
Нельзя работать в дополнительном потоке с формами. Ни в каком виде.

у меня всё нормально работает... если не использовать поток, то мне придётся по всему коду ProgressMessages расставлять, что не есть хорошо...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Демо
Дата 29.12.2005, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Albinos_x @ 29.12.2005, 02:13)
у меня всё нормально работает...


Ну хорошо... До поры работает.

Цитата(Albinos_x @ 29.12.2005, 02:13)
если не использовать поток, то мне придётся по всему коду ProgressMessages расставлять, что не есть хорошо..


Зачем?

Ты, скорее всего, логику спроектировал неправильно.
У тебя поток чем занимается?


--------------------
    
PM MAIL ICQ Skype   Вверх
Albinos_x
Дата 29.12.2005, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата
У тебя поток чем занимается?

чтение(одного или нескольких)/запись(в один) файла(ов)
Добавлено @ 10:46
Цитата
Зачем?

если не проставлять (или не организовывать поток), то приложение будет "зависать" на время обработки файлов... это не очень хорошо смотрится... причём процесс обработки из-за этого тоже не отображается...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Демо
Дата 29.12.2005, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(Albinos_x @ 29.12.2005, 11:42)
если не проставлять (или не организовывать поток), то приложение будет "зависать" на время обработки файлов... это не очень хорошо смотрится... причём процесс обработки из-за этого тоже не отображается...


В принципе, логически правильно.

Для подобных задач существует 2 простых решения.
1. Поток работает, но процессом отображения хода работы доп. потока занимается основной поток.
Самое простое и логичное решение. Но не всегда приемлимо, если основной поток вообще не должен знать о
дополнительном. Синхронизация не вызывает проблем.
2. Поток работает, в нем же создается окно средствами Win32Api, в котором и отображается ход работы потока.
Решение хорошее, но несколько более трудоемкое. Синхронизация не требуется.



--------------------
    
PM MAIL ICQ Skype   Вверх
Albinos_x
Дата 29.12.2005, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата
1. Поток работает, но процессом отображения хода работы доп. потока занимается основной поток.
Самое простое и логичное решение. Но не всегда приемлимо, если основной поток вообще не должен знать о
дополнительном. Синхронизация не вызывает проблем.
2. Поток работает, в нем же создается окно средствами Win32Api, в котором и отображается ход работы потока.
Решение хорошее, но несколько более трудоемкое. Синхронизация не требуется.

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

Спавибо за совет.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.