Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.06;
Скачать: CL | DM;

Вниз

Функция, ожидающая поступления данных (как showmodal)   Найти похожие ветки 

 
Mr tray   (2006-07-15 01:01) [0]

Здравствуйте. Я хочу сделать такую штуку. Есть код в юните, который в данный момент выполняется. В какой то миг приходит очередь выполниться одной функции, задача которой остановить выполнение кода, дождаться поступления данных извне, обработать полученные данные, выдать определенный результат и пустить выполняться код дальше. Можно сделать это с помощью цикла, выход из которого возможен только после изменения определенной глобальной переменной (которая будет изменена извне). Но хотелось бы, чтоб это выглядело, примерно как a:=myform.showmodal; case a of .... и тп. Только вместо showmodal моя функция.


 
DrPass ©   (2006-07-15 01:17) [1]

WaitForSingleObject / WaitForMultipleObjects подойдут?


 
Mr tray   (2006-07-15 01:29) [2]

а Х их знает..... я не знаю, как их использовать. Если поможете, буду премного благодарен.


 
Mr tray   (2006-07-15 01:50) [3]

как я понимаю, waitforsingleobоect может следить только за объектами определенных категорий. можно ли как то подогнать мой случай под эти условия, чтоб можно было применить waitforsingleobоect?


 
DrPass ©   (2006-07-15 02:54) [4]

В общем случае можно. Есть "пользовательские" объекты, например, Event"ы. Ты можешь в нужной ситуации запустить event, и ожидающая его функция сразу же продолжит работу.


 
Loginov Dmitry ©   (2006-07-15 08:23) [5]

> а Х их знает..... я не знаю, как их использовать


- Создание Eventa: H = CreateEvent(nil, True, True, nil);
- Ожидание: WailForSingleObject(H, DWORD(-1)) - если объект-событие в состоянии "Откл", то замораживает текущий поток до тех пор, пока его состояние не станет "Вкл".
- SetEvent(H) - переход в состояние "Вкл"
- ResetEvent - переход в состояние "Откл"
- CloseHandle(H) - "уничтожение" объекта-события. Делается в самом конце, когда объект уже не нужен.


 
Kolan ©   (2006-07-15 10:44) [6]


> а Х их знает..... я не знаю, как их использовать. Если поможете,
>  буду премного благодарен.

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


 
Ketmar ©   (2006-07-15 11:21) [7]

хм. суспендить поток чревато. мало ли, где он там остановится...


 
Leonid Troyanovsky ©   (2006-07-15 11:33) [8]


> 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.


 
Mr tray   (2006-07-15 13:00) [9]

а как запихнуть юнит в другой поток (если так, конечно, можно выразиться)?


 
Kolan ©   (2006-07-15 13:28) [10]


> а как запихнуть юнит в другой поток (если так, конечно,
> можно выразиться)?

Так конечно выражаться не правильно...
Для этого есть класс TThread + F1.


 
Kolan ©   (2006-07-15 13:30) [11]


> хм. суспендить поток чревато. мало ли, где он там остановится.
> ..

А что череватого? Делале дела, заснул, как данные пришли, его будят... Но можно и Wait функциями...


 
Ketmar ©   (2006-07-15 16:39) [12]

>Kolan ©   (15.07.06 13:30) [11]
а если он замер в "позе зю"? и потом из этой позы выпал? не надо суспендить потоки без нужды. лучше WaitForXXX().


 
Mr tray   (2006-07-15 19:14) [13]

Так. Значит. Делаю так:
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 главной формы моего приложения. Что я делаю не так?


 
Джо ©   (2006-07-15 19:17) [14]

> а именно на waitforsingleobject, ВСЯ моя программа повисает.

А чего же ты добивался, как не этого?


 
Джо ©   (2006-07-15 19:18) [15]

Поток (в данном случае, главный) был заморожен до возникновения события.


 
Kolan ©   (2006-07-15 21:24) [16]

Кажется про потоки ты недочитал... Читай про Execute..
PS
 И оформлять научись.. читать трудно..


 
Mr tray   (2006-07-15 22:36) [17]


>  И оформлять научись.. читать трудно..

А как я должен оформить, покажи, пожалуйста.


 
Mr tray   (2006-07-15 23:32) [18]

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 23:52) [19]

аа. всё. врубился вроде. вместо execute надо resume написать?


 
Kolan ©   (2006-07-16 00:26) [20]


> А как я должен оформить, покажи, пожалуйста.

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
А вообще гораздо проще прочесть Тейкста и Пачеко и все на места встанет...


 
Kolan ©   (2006-07-16 00:28) [21]


> аа. всё. врубился вроде. вместо execute надо resume написать?

Как это  - вообще бред, где написать , зачем...

Если поток создан НЕ спящим Execute стартует после создания...



Страницы: 1 вся ветка

Текущий архив: 2006.08.06;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.053 c
2-1152841836
Toy
2006-07-14 05:50
2006.08.06
DBText и DBComboBox


2-1153316894
fast2
2006-07-19 17:48
2006.08.06
Не подключается ADOQuery


2-1153136297
webpauk
2006-07-17 15:38
2006.08.06
InputBox


6-1143079681
vadim1
2006-03-23 05:08
2006.08.06
"Asynchronous socket error 10061".


2-1153462397
Svetok
2006-07-21 10:13
2006.08.06
MySQL