![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функция, ожидающая поступления данных (как showmodal) [D6, XP]
Mr tray © (2006-07-15 01:01:00)Здравствуйте. Я хочу сделать такую штуку. Есть код в юните, который в данный момент выполняется. В какой то миг приходит очередь выполниться одной функции, задача которой остановить выполнение кода, дождаться поступления данных извне, обработать полученные данные, выдать определенный результат и пустить выполняться код дальше. Можно сделать это с помощью цикла, выход из которого возможен только после изменения определенной глобальной переменной (которая будет изменена извне). Но хотелось бы, чтоб это выглядело, примерно как a:=myform.showmodal; case a of .... и тп. Только вместо showmodal моя функция.
Kolan (2006-07-16 00:28:00) [1]
> аа. всё. врубился вроде. вместо execute надо resume написать?
Как это - вообще бред, где написать , зачем...
Если поток создан НЕ спящим Execute стартует после создания...
Kolan (2006-07-16 00:26:00) [2]
> А как я должен оформить, покажи, пожалуйста.
http://www.citforum.ru/programming/delphi/style_delphi/
Те не:
> waitforsingleobject(ev,INFINITE);
а,
WaitForSingleObject(Ev,INFINITE);
> аа. всё. врубился вроде. вместо execute надо resume написать?
Таак.... краткий обзор.
Код помешенный в Execute выполнится в контексте потока.
Далее смотрим пост 1
Всю работу вставляещь в поток, затем ожидание, затем то что надо сделать кода данные пришли.
Те пример:
procedure Execute;
begin
{Создали Event.}
{Работаем}
if WaitForSingleObject(ev,INFINITE) = WAIT_OBJECT_0 then //Ждем
{Дождались, делаем остальное}
{В конце выдали результат с помощью любого механизма: SendMessage, событие итд... }
end;
Далее.
create(b:boolean);
Если B = True, то по ток создасться спящим.
Кроме того не забудь перекрыть(override) метод Execute.
> Всё равно виснет
Странный вопрос. Значит ты что-то оставил в гл. потоке.
PS
Незабудь что почти вся VCL НЕ потоко безапасна. Поэтому используй механизмы синхранизации(Synchronizeнапример) для вывода результатов работы.
PPS
А вообще гораздо проще прочесть Тейкста и Пачеко и все на места встанет...
Mr tray (2006-07-15 23:52:00) [3]аа. всё. врубился вроде. вместо execute надо resume написать?
Mr tray (2006-07-15 23:32:00) [4]
constructor Ttype.create(b:boolean);
begin
inherited create(b);
execute;
end;
procedure Ttype.execute;
begin
ev:=CreateEvent(nil, True, false, nil);
waitforsingleobject(ev,INFINITE);
... и тд ...
end;
Всё равно виснет. Читал хелп. Там сказано: в execute должна содержаться функция потока (The Execute method is your thread function). Что я ещё должен сделать, чтоб всё работало?
Mr tray (2006-07-15 22:36:00) [5]
> И оформлять научись.. читать трудно..
А как я должен оформить, покажи, пожалуйста.
Kolan (2006-07-15 21:24:00) [6]Кажется про потоки ты недочитал... Читай про Execute..
PS
И оформлять научись.. читать трудно..
Джо (2006-07-15 19:18:00) [7]Поток (в данном случае, главный) был заморожен до возникновения события.
Джо (2006-07-15 19:17:00) [8]> а именно на waitforsingleobject, ВСЯ моя программа повисает.
А чего же ты добивался, как не этого?
Mr tray (2006-07-15 19:14:00) [9]Так. Значит. Делаю так:
unit gameSystem;
interface
uses
messages,windows,classes;
type
... типы ...
Ttype=class(Tthread)
... разная дребедень ...
public
ev:thandle;
constructor create(b:boolean);
end;
implementation
constructor Ttype.create(b:boolean);
begin
inherited create(b);
ev:=CreateEvent(nil, True, false, nil);
waitforsingleobject(ev,INFINITE);
... и тд ...
end;
end.
Но на ttype.create, а именно на waitforsingleobject, ВСЯ моя программа повисает. ttype.create я вызываю при create главной формы моего приложения. Что я делаю не так?
Ketmar (2006-07-15 16:39:00) [10]>Kolan © (15.07.06 13:30) [11]
а если он замер в "позе зю"? и потом из этой позы выпал? не надо суспендить потоки без нужды. лучше WaitForXXX().
Kolan (2006-07-15 13:30:00) [11]
> хм. суспендить поток чревато. мало ли, где он там остановится.
> ..
А что череватого? Делале дела, заснул, как данные пришли, его будят... Но можно и Wait функциями...
Kolan (2006-07-15 13:28:00) [12]
> а как запихнуть юнит в другой поток (если так, конечно,
> можно выразиться)?
Так конечно выражаться не правильно...
Для этого есть класс TThread + F1.
Mr tray (2006-07-15 13:00:00) [13]а как запихнуть юнит в другой поток (если так, конечно, можно выразиться)?
Leonid Troyanovsky (2006-07-15 11:33:00) [14]
> Mr tray (15.07.06 01:50) [3]
> за объектами определенных категорий. можно ли как то подогнать
> мой случай под эти условия, чтоб можно было применить waitforsingleobоect?
Можно, например, ожидать завершения потока (TThread.Handle)
Ну, а это - как можно ожидать:
http://groups.google.com/group/fido7.ru.delphi.chainik/msg/c355993ba823b53c
--
Regards, LVT.
Ketmar (2006-07-15 11:21:00) [15]хм. суспендить поток чревато. мало ли, где он там остановится...
Kolan (2006-07-15 10:44:00) [16]
> а Х их знает..... я не знаю, как их использовать. Если поможете,
> буду премного благодарен.
Подойдут..
Но учти если ты будешь ждать в главном потоке, то на время ожидания приложение "повиснет". Поэтому для ожидания заведи дополнительный поток. Кроме этих ф-ций вполне подойдут методы потока(классаTThread) -SuspendиResume.
Loginov Dmitry (2006-07-15 08:23:00) [17]> а Х их знает..... я не знаю, как их использовать
- Создание Eventa: H = CreateEvent(nil, True, True, nil);
- Ожидание: WailForSingleObject(H, DWORD(-1)) - если объект-событие в состоянии "Откл", то замораживает текущий поток до тех пор, пока его состояние не станет "Вкл".
- SetEvent(H) - переход в состояние "Вкл"
- ResetEvent - переход в состояние "Откл"
- CloseHandle(H) - "уничтожение" объекта-события. Делается в самом конце, когда объект уже не нужен.
DrPass (2006-07-15 02:54:00) [18]В общем случае можно. Есть "пользовательские" объекты, например, Event'ы. Ты можешь в нужной ситуации запустить event, и ожидающая его функция сразу же продолжит работу.
Mr tray (2006-07-15 01:50:00) [19]как я понимаю, waitforsingleobоect может следить только за объектами определенных категорий. можно ли как то подогнать мой случай под эти условия, чтоб можно было применить waitforsingleobоect?
Mr tray (2006-07-15 01:29:00) [20]а Х их знает..... я не знаю, как их использовать. Если поможете, буду премного благодарен.