![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Thread [D6, Win95/98]
skiph © (2002-12-05 10:45:00)Работает поток, в ходе может его выполнения потребоваться приостановить работу на время и передать управление другой форме. После выполнения определенных действий, форма закрывается и поток снова должен возобновить свою деятельность. Проблема в том, что форма хоть и отображается, но неактивна. Пробовал передавать ей управление через Synchronize(Form2.ShowWindow), где
procedure TNewRecord.ShowWindow;
begin
NewRecord.ShowModal;
end;
Не помогает.
Alx2 (2002-12-10 12:24:00) [1]>Ihor Osov"yak © (10.12.02 11:00)
>При вызове через синхронайз "подсинхронайзнутая" функция
>выполняется в контексте главного потока. Это можете расценить
>как комментарий к вашему "из своего потока" ...
Угу. Конечно. Но имхо это уже буквоедство. Так можно докатиться до фраз "переходишь в режим ядра и создаешь новый объект синхронизации"
Ihor Osov'yak (2002-12-10 11:00:00) [2]2 Alx2 © (06.12.02 08:10)
> синхронизированно кажешь его из своего потока и в зависимости
> от выбора пользователья продолжаешь работу.
При вызове через синхронайз "подсинхронайзнутая" функция выполняется в контексте главного потока. Это можете расценить как комментарий к вашему "из своего потока" ...
2 skiph © (06.12.02 06:09)
Такая схема должно работать. Если форма с вопросом создавалась восновном потоке, а ее активация идет через синхронайз и в тоже времмя цікл віборки основного потока не приторможен. То есть, если у вас проблемы - то форму с вопросом вы создавали в рабочем потоке (очень оригинально), либо у Вас приторможен цыкл выборки главного потока (к ппримеру, вы ожидаете завершения рабочего потока через какой-то обьект синхронизации).
Зы - а вопрос можно задать и через апишный, к примеру см.
Alx2 © (06.12.02 08:10) (в этой части он прав)
MessageBox(0, "Нажмите на кнопку", "Ответьте на вопрос:", MB_YESNO or MB_DEFBUTTON1 or MB_ICONQUESTION) - єта вещь вполне потокобезопасна, можно візівать с любого потока и не заботится о синхронизации и проблемами с блокировками ...
Ihor Osov'yak (2002-12-10 10:50:00) [3]2 Alx2 © (06.12.02 08:10)
Alx2 (2002-12-06 08:15:00) [4]>Alx2 © (06.12.02 08:10)
Вдогонку. По инерции в первом примере воткнул ShowMessage. Он тоже требует Synchronize.
Alx2 (2002-12-06 08:10:00) [5]>skiph © (06.12.02 06:09)
В данном примере Synchronize не нужно.
procedure TMyThread.DoMessage;
begin
case MessageBox(0, "Нажмите на кнопку", "Ответьте на вопрос:", MB_YESNO or MB_DEFBUTTON1 or MB_ICONQUESTION) of
IDYES : ShowMessage("Нажато YES");
IDNO : ShowMessage("Нажато NO");
end;
end;
procedure TMyThread.Execute;
begin
DoMessage;
end;
А в этом примере Synchronize нужно. Так как используются глобальные незащищенные объекты Screen и т.д.
procedure TMyThread.DoMessage;
begin
with TForm.create(Nil) do
begin
ShowModal;
free;
end;
end;
procedure TMyThread.Execute;
begin
Synchronize(DoMessage);
end;
Таким образом, рисуешь свой диалог с нужной дополнительной инфой, модально и синхронизированно кажешь его из своего потока и в зависимости от выбора пользователья продолжаешь работу.
skiph (2002-12-06 06:09:00) [6]to Alx2
Извиняюсь - очепятка.
А суть задумки такая: перебрасываются данные из одной БД в другую, причем для некоторых строковых полей в старой базе, в новой заводятся справочники. Прочитав значение такого поля, я ищу в справочнике уже имеющуюся соответствующую запись. Если таковая не найдена, я должен спросить у пользователя: добавить это значение в справочник или заменить на другое значение (в случае если запись сделана с ошибкой). Для этого и открываеся форма.
При это работа потока не останавливается, а лишь приостанавливается на время и после того, как пользователь сделает выбор, продолжает работу с той точки, на которой
NailS (2002-12-05 13:15:00) [7]SendMessage ?
Alx2 (2002-12-05 12:43:00) [8]>Ihor Osov"yak © (05.12.02 11:41)
>Иногда лучше жевать... Сорри, не удержался ...
Да ничего... потом, глядишь, получится.
По теме:
"в ходе может его выполнения потребоваться приостановить работу на время и передать управление другой форме. После выполнения определенных действий, форма закрывается и поток снова должен возобновить свою деятельность"
Отбросим, конечно, терминологическую несуразицу автора.
Если рассмотреть основной поток+модальная форма. Зачем городить огород, если однопоточная модель так и работает?
Ihor Osov'yak (2002-12-05 11:41:00) [9]2 Alx2 © (05.12.02 11:31)
Иногда лучше жевать... Сорри, не удержался ...
2 skiph © (05.12.02 10:45) - Обратите внимание на Внук © (05.12.02 11:28), а так в общем - используйте посылку сообщений в основной поток а также обьекты синхронизации ...
Зы - надеюсь,что в своем потоке Вы напрямую не работаете с обьектами VCL..
Alx2 (2002-12-05 11:31:00) [10]>skiph © (05.12.02 10:45)
Модально покажи форму из свово потока
Внук (2002-12-05 11:28:00) [11]Поток передает управление форме...
Давайте почетче с терминами :)