| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Работа в потоке с формой |
| Автор: Albinos_x 28.12.2005, 23:29 | ||||
в общем делаю так:
если не делать через поток, то всё работает нормально. и самое интересное что если сделать так:
то ошибка вылетает на form1.Timer1.Enabled:=false; При чём при пошаговой отладке эта ошибка не вылетает(?). Файл во всех случаях создаётся. Объясните плз, в чём я не прав... |
| Автор: Albinos_x 29.12.2005, 00:05 |
| я тут порылся в коде... MessageDlg не вылетает потому что на нём и вылетает ошибка... если эти строчки убрать то уже ошибка не вылетает... может есть ещё способ как вывести из потока сообщение о завершении работы процедуры? |
| Автор: Snowy 29.12.2005, 00:09 | ||
| MessageBox(0, 'Я всё', 'Поток', MB_OK); Добавлено @ 00:14
|
| Автор: Albinos_x 29.12.2005, 00:23 |
| СПАСИБО! Всё работает... поясни пожалуйста, почему MessageDlg не хотел работать? |
| Автор: Snowy 29.12.2005, 00:34 |
| Потому что MessageDlg принадлежит Application. Поэтому тебе нельзя юзать user объекты основного потока. А MessageBox - чистый WinAPI. Он никому не принадлежит. Но работать с классами из вторичного потоко не рекомендуется - будут накладки основного и вторичного потока. Особенно, если таких потоков много. Например form1.ListBox1.Items.Add(TypFile[j].rtFileName). Если он одновременно будет вызван из двух потоков, то лажа получится. Поэтому по всем правилам рекомендуется работать с визуальными компонентами только в синхронизации. |
| Автор: Albinos_x 29.12.2005, 00:43 | ||
ясно...
это у меня пока тестовое приложение... а так я буду блокировать вызов ещё одного потока, пока этот не закончит работать... еще раз СПАСИБО! |
| Автор: Демо 29.12.2005, 01:01 | ||
Нельзя работать в дополнительном потоке с формами. Ни в каком виде. |
| Автор: Albinos_x 29.12.2005, 01:13 | ||
у меня всё нормально работает... если не использовать поток, то мне придётся по всему коду ProgressMessages расставлять, что не есть хорошо... |
| Автор: Демо 29.12.2005, 09:50 | ||||
Ну хорошо... До поры работает.
Зачем? Ты, скорее всего, логику спроектировал неправильно. У тебя поток чем занимается? |
| Автор: Albinos_x 29.12.2005, 10:42 | ||||
чтение(одного или нескольких)/запись(в один) файла(ов) Добавлено @ 10:46
если не проставлять (или не организовывать поток), то приложение будет "зависать" на время обработки файлов... это не очень хорошо смотрится... причём процесс обработки из-за этого тоже не отображается... |
| Автор: Демо 29.12.2005, 10:53 | ||
В принципе, логически правильно. Для подобных задач существует 2 простых решения. 1. Поток работает, но процессом отображения хода работы доп. потока занимается основной поток. Самое простое и логичное решение. Но не всегда приемлимо, если основной поток вообще не должен знать о дополнительном. Синхронизация не вызывает проблем. 2. Поток работает, в нем же создается окно средствами Win32Api, в котором и отображается ход работы потока. Решение хорошее, но несколько более трудоемкое. Синхронизация не требуется. |
| Автор: Albinos_x 29.12.2005, 11:09 | ||
ну я писал, что это пока тестовое приложение... поэтому остановился на блокировке вызова второго потока... а когда буду делать не тестовое думаю всё таки остановиться на втором варианте.... Спавибо за совет. |