Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Вниз

Ожидание события   Найти похожие ветки 

 
Прохожий   (2003-09-03 09:11) [0]

Как заставить программу ждать какое то событие? Например изминения глобальной переменной. Конструкция типа reapit until Flag; просто стопорит прогу.


 
KSergey   (2003-09-03 09:13) [1]

Правильно стопит. А как же иначе? Вы написали бесконечный цикл, который ничего не делает - компьютер его честно отрабатывает. Бесконечно.

А где эта переменная должна по задумке изменяться?


 
Dmitriy O.   (2003-09-03 09:14) [2]

a:=b
If a<>b then


 
Прохожий   (2003-09-03 09:22) [3]

//А где эта переменная должна по задумке изменяться?
Ну например в обработчике события компонента, или в потоке


 
pasha_676   (2003-09-03 09:28) [4]

Простые решения (имхо)
Первое потоки.
Второе - посылать сообщение при изменении переменной.
Третье - класс в котором эта переменная суть проперти, при ее изменении идет отработка.
Собственно в зависимости от целей и задач могут применяться и какие-нибудь совместные решения.
Ну и самое простое - Application.ProcessMesage


 
Прохожий   (2003-09-03 09:31) [5]

//pasha_676 ©
Так то оно может быть и так, но для новичка в делфи - это как то всё расплывчато. Можно поподробнее, или лучше всего пример?


 
pasha_676   (2003-09-03 09:36) [6]

Что конкретно нужно. Опиши задачу. Не совсем понятна постановка вопроса.


 
Прохожий   (2003-09-03 09:43) [7]

Суть такая. В цикле создаю поток и передаю ему через конструктор параметры. Но толи он долго создаёться, то ли что. Но у одной переменной передаёться всегда только значеное, которое должно было быть для последнего потока. Вот я и хочу заставить прогу ждать, пока поток железно запуститься и начнёт работать, а уже потом разчитывать новые параметры и создавать новый поток


 
Palladin   (2003-09-03 09:49) [8]

Ну например
const
wm_value1changed=wm_user+1;

var
Value1:integer;

type
TForm1=class(Form)
....
private
{ Private declarations }
procedure Value1Changed(var msg:TMessage); message wm_value1changed;
....
end;

procedure SetValue1(v:integer);
begin
if value1<>v then
begin
value1:=v;
PostMessage(Form1.Handle,wm_value1changed,value1,0);
end;
end;

procedure TForm1.Value1Changed;
begin
Button1.Caption:=inttostr(msg.WParam);
end;


после этого если хочешь что бы Form1 уведомлялась об изменении значения, то меняй его посредством процедуры SetValue1


 
Прохожий   (2003-09-03 13:18) [9]

Ну меесажи это конечно хорошо, а как мне послать сообщение в главный модуль? Я пытаюсь передать в поток форму, а нифига не выходит. Да и не правильно это, наверное?


 
Прохожий   (2003-09-03 13:39) [10]

Что я делаю нитак?


 
Некрофил-затейник___   (2003-09-03 13:44) [11]


type
TOnChange = procedure(Sender:TObject;value:Variant) of object;//тип указатель на процедуру

TSomeClass = class
private
fx:integer;
fOnChange:TOnChange;
...
procedure SetX(value:integer);
function GetX():integer;
public
property x:integer read GetX write SetX;
...
property OnChange:TOnChange read fOnChange write fOnChange;
end;

TMainClass = class(TForm)
published
procedure Create();
..
private
...
someClass:TSomeClass;
...
procedure OnChange(Sender:TObject;value:Variant)
end;
implementation
begin
....
procedure TSomeClass.SetX(value:integer);
begin
fx := value;
if(@fOnChange <> nil)then //если указатель не равен nil
fOnChange(self,fx);//вызвать через указатель на функцию обработку
end;

function TSomeClass.GetX():integer;
begin
Result := fx;
end;

procedure TMainClass.Create();
begin
//создание экземпляра класса и присваевание указателя на функцию обработчик
SomeClass := TSomeClass.Create();
SomeClass.OnChange := OnChange;
end;

procedure TMainClass.OnChange();
begin
//исполняемый по событию код
ShowMessage("");
end;
end;


С уважением
Некрофил Затейникович Ликантроп
Nekrofil@graveyard.edu


 
pasha_676   (2003-09-03 13:45) [12]


> как мне послать сообщение в главный модуль?

Так и послать. Хотя строго говоря сообщения посылаються не модулю.


> Я пытаюсь передать в поток форму

Вот это не понятно абсолютно. Зачем? (Да и собственно как?)


 
han_malign   (2003-09-03 13:47) [13]

"ошибка в 17 строке"(с)Anatoly Podgoretsky


 
Digitman   (2003-09-03 13:48) [14]


> Прохожий


> толи он долго создаёться, то ли что


разумеется, старт нового кодового потока для системы не есть мгновенная операция...и похожа она по "тяжести" на старт холодного двигателя в мороз

проверить гарантированный старт поточной ф-ции можно, например, след. образом :

constructor TMyThread.Create(...);
begin
inherited ....;
...
// пока не существует очередь сообщений потока, крутимся в цикле
while not PostThreadMessage(ThreadId, WM_USER, 0,0) do;
...
end;

procedure TMyThread.Execute;
var
Msg: TMsg;
begin
PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE); // очередь сообщений потоку создана с этого момента

... едем дальше
end;


 
Palladin   (2003-09-03 13:50) [15]

Йоптыть.
Передавай при создании потока handle окна которым ловить хочешь.
И используй PostMessage из потоков, в чем проблема?


 
Прохожий   (2003-09-03 13:51) [16]

//Так и послать. Хотя строго говоря сообщения посылаються не модулю.
Как так?
вот строка: PostMessage(Form1.Handle,wm_value1changed,value1,0);</COD E>
Если я это пишу в модуле потока, то получаю ошибку: необявленный идентификатор Form1


 
Palladin   (2003-09-03 13:53) [17]

помоему тебе еще рано потоками заниматся...


 
Digitman   (2003-09-03 13:58) [18]


> Прохожий


> Если я это пишу в модуле потока, то получаю ошибку: необявленный
> идентификатор Form1


эт точно) ... поток там или не поток - монопенисуально)
это ж - азы Паскаля как такового !
обращение в одном из модулей к идентификатору, описанному в другом модуле, требует в первом модуле указания в разделе USES имени модуля, где этот ид-р объявлен. За редкими специсключениями)


 
Palladin   (2003-09-03 14:02) [19]

моно пени суа льно :)
слово то какое, интеллихентное, так и буду выражатся :))


 
Digitman   (2003-09-03 14:06) [20]


> Palladin


и не вздумай сказать вместо этого "индифферентно"... или - еще страшней - "безразлично") ... особливо - в обществе с присутствующими дамами) ... сразу сочтут за хама и матершинника отпетого))


 
pasha_676   (2003-09-03 14:07) [21]


> Как так?


> вот строка:PostMessage(Form1.Handle,wm_value1changed,value1,0);

ЭЭЭЭЭ.... Form1 не модуль. Модуль и объект суть вещи разные. Ну и видимость обеспечить - это как бы более базовая задача. К потокам и мессагам не имеет никакого отношения. Давай создай для тренировки две формы (для начала в одном проекте), чтоб они мессагами перекидывались.


 
han_malign   (2003-09-03 14:10) [22]

>разумеется, старт нового кодового потока для системы не есть мгновенная операция...
- в отличии от пользователя, во всяком случае, для меня 20 миллисекунд - это мгновенно...


 
Digitman   (2003-09-03 14:12) [23]


> pasha_676


> Модуль и объект суть вещи разные


да тут даже не о разных сущностях как таковых речь идет)
Символьный идентификатор и область его определения/видимости - вот что первично с т.з. алгоритм.языка ! И далеко не только Паскаля)


 
Digitman   (2003-09-03 14:14) [24]


> han_malign


вот на слишком вольной трактовке "мгновенности" сабжа автор и попался)... не попадись и ты на ней !)


 
Прохожий   (2003-09-03 14:28) [25]

// это ж - азы Паскаля как такового !
обращение в одном из модулей к идентификатору, описанному в другом модуле, требует в первом модуле указания в разделе USES имени модуля, где этот ид-р объявлен.

Не умничай. В uses всё прописано


 
han_malign   (2003-09-03 14:29) [26]

>Digitman © (03.09.03 14:14) [24]
просто, обычно ожидают завершения потока или текущей поточной операции, а вот начало потока - ни разу не было такой нужды. Разве что для взаимной синхронизации двух потоков с большой точнстью(скажем аудио<->видио), но опять таки точнее системного кванта времени потока(те же 20 мс) не получится...


 
Palladin   (2003-09-03 14:50) [27]


> Прохожий © (03.09.03 14:28) [25]

Э, парень, не хорошо так отвечать знающим людям. Ведь правду говорят. Получается ты не знаешь что нужно прописать что бы достучатся до Form1. Простой выход из ситуации с пердачей handle тебя тоже не устраивает?


 
Digitman   (2003-09-03 14:58) [28]


> han_malign


ну почему же "обычно" ?

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


> Прохожий © (03.09.03 14:28) [25]
> Не умничай. В uses всё прописано


ишь ты ! умник нашелся !)

чудес-то не бывает)

если компилятор , не обнаружив целевой ид-р в текущем модуле, равно как не обнаружил его и среди uses-модулей, он как раз и извещает тебе, что, мол, "такой-то идентификатор не декларирован"


 
Прохожий   (2003-09-03 15:04) [29]

// если компилятор , не обнаружив целевой ид-р в текущем модуле, равно как не обнаружил его и среди uses-модулей, он как раз и извещает тебе, что, мол, "такой-то идентификатор не декларирован"
Это всё понятно, но непонятно почему так происходит.
Модуль с потоком прописан в главном модуле. Если я в модуле потока прописываю главный модуль - получаю ошибку типа "Circelar unit reference to ... "


 
Digitman   (2003-09-03 15:05) [30]


> Прохожий


Модуль1
interface
uses Модуль2
переменная := идент-р

Модуль2
interface
..
const идент-р = значение;


 
Digitman   (2003-09-03 15:08) [31]


> главный модуль


это как понимать - "главный" ?


> получаю ошибку типа "Circelar unit reference to ... "


опять же - незнание Паскаля)

Мод1
interface
uses Мод2

Мод2
implementation
uses Мод1

это написано в любом букваре по языку


 
Прохожий   (2003-09-03 15:09) [32]

>Digitman © (03.09.03 15:05) [30]
Будем азы преподавать? А может быть ты мне раскашешь о константах, локакльных и глобавльных переменных?
Я не настолько чайник!!!


 
Прохожий   (2003-09-03 15:11) [33]

>Digitman © (03.09.03 15:08) [31]

Мод1
interface
uses Мод2

Мод2
implementation
uses Мод1

это написано в любом букваре по языку


Вот если я так пишу, то и получаю вышеозвученую ошибку


 
Digitman   (2003-09-03 15:11) [34]


> Прохожий



> Будем азы преподавать?


Желания, знаешь ли , такого у меня нет.
Давай так - ты откладываешь все свои поточные дела, берешь любой мало-мальски приличный букварь по ObjectPascal и штудируешь его от корки до корки, восполняя пробелы в соотв.знаниях)


 
Digitman   (2003-09-03 15:12) [35]


> Вот если я так пишу, то и получаю вышеозвученую ошибку


вот если ты ИМЕННО ТАК напишешь, то никаких цикл.ссылок не будет !!


 
Palladin   (2003-09-03 15:13) [36]


> Прохожий © (03.09.03 15:11) [33]

Нет ты немножко не так пишешь. Я в этом уверен.


 
han_malign   (2003-09-03 15:13) [37]

на самом деле системный квант времени 100нс, иначе Perfomance Counters не работали бы...

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

PostThreadMessage
.................
· Create an event object, then create the thread. Use the WaitForSingleObject function to wait for the event to be set to the signaled state before calling PostThreadMessage. In the thread to which the message will be posted, call PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) to force the system to create the message queue. Set the event, to indicate that the thread is ready to receive posted messages.

З.Ы. А мне, обычно, хватает передачи параметров в конструкторе(перед CreateThread) и критической секции - не люблю злоупотреблять "халявными" очередями...


 
Прохожий   (2003-09-03 15:14) [38]

>от если ты ИМЕННО ТАК напишешь, то никаких цикл.ссылок не будет !!

Именно так и пишу


 
pasha_676   (2003-09-03 15:20) [39]


> Именно так и пишу

Чудес не бывает. Лучше смотри ссылки на модули, а не спорь.


 
Digitman   (2003-09-03 15:21) [40]


> Прохожий


> Именно так и пишу


не верю !) ну ни в жизнь не поверю !)

так что, собссно, у тебя есть "главный модуль"-то, а ? таки не сподобишься просветить ?


> han_malign


> А мне, обычно, хватает


ну хватает так хватает) ... я ж не настаиваю на ином)


 
Ketmar#   (2003-09-03 15:26) [41]

>#32
не чайник? иди тогда на хацкер.ру с крутыми вопросами и возмущениями. то, что ты АЗОВ-то как раз и не знаешь -- самоочевидно. и нечего возмущаться, когда тебе объясняют. лучше бы поблагодарил.

зыж
и откуда столько хамья? достали...


 
Ketmar   (2003-09-03 15:27) [42]

последний пост -- это я настоящий. опечатался в имени %-)


 
Digitman   (2003-09-03 15:32) [43]


> Ketmar



> это я настоящий


не верю !) иде, понимаешь ли, сатанасы твои и прочие нобискумы ?))... без штампика фырменного справочку не дадим в том что Кетмар это Кетмар)) ... а не верблюд гималайский))))


 
Anatoly Podgoretsky   (2003-09-03 15:38) [44]

Ты кто прохожий? Ну так и проходи мимо, если партнер то другое дело, но не видать этого.


 
panov   (2003-09-03 15:40) [45]

>Ketmar

Хоть тебе и удобнее номера писать, но всем остальным читать просто невозможно...

Можешь, конечно, и дальше так же писать ссылки, но, как минимум, 50% не будут смотреть, что ты пишешь и кому отвечаешь.


 
han_malign   (2003-09-03 15:45) [46]

panov © (03.09.03 15:40) [45]
- а надо тэг для локальной(в ветке) ссылки завести, раз уж номер появился


 
Palladin   (2003-09-03 15:49) [47]

Нужно кнопочку после номера поста для автозанесения в тело сообщения. Будет жутко удобно.


 
Serginio666   (2003-09-03 16:31) [48]

Кроме PostThreadMessage еще существуют CoMarshalInterface и CoUnMarshalInterface и их производные CoMarshalInterThreadInterfaceInStream и CoGetInterfaceAndReleaseStream.
Так же APC QueueUserAPC.


 
Ketmar   (2003-09-03 18:03) [49]

>panov © (03.09.03 15:40) [45]
а зачем тогда, елы-палы, номера вообще? ну пусть будет автораспознавание номеров и вставка строк, как здесь. а то кнопочек нормальных в Опере всё равно не дождёшься...


 
Sandman25   (2003-09-03 18:19) [50]

Ketmar

Я думаю, что указание ника автора поста, на который Вы отвечаете, полезнее.
Кроме номера ставьте и ник, и я думаю, что проблем не будет.
Во всяком случае, у меня :)


 
Ketmar   (2003-09-03 19:19) [51]

>Sandman25 © (03.09.03 18:19) [50]
это печатать надо больше. или мышой елозить и копировать. секунда+секунда+секунда... это ж где столько времени набрать? %-)


 
Ketmar   (2003-09-03 19:21) [52]

>Sandman25 © (03.09.03 18:19) [50]
это печатать надо больше. или мышой елозить и копировать. секунда+секунда+секунда... это ж где столько времени набрать? %-)


 
Anatoly Podgoretsky   (2003-09-03 21:43) [53]

Ketmar © (03.09.03 19:21) [52]
По вертикали надо двигать.


 
Прохожий   (2003-09-04 07:49) [54]

Я конечно с уважением отгошусь к участникам форума, тем более я вижу, что мои знания явно не велики, но вот, например по поводу
Digitman © (03.09.03 15:08) [31]
опять же - незнание Паскаля)

Мод1
interface
uses Мод2

Мод2
implementation
uses Мод1

это написано в любом букваре по языку


Создаю пустой проект, добавляю ещё один юнит и прописываю в Uses. Получаеться следующее:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Unit2,
StdCtrls;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

end.




unit Unit2;

interface
uses unit1;

implementation

end.


Компилирую и получаю ошибку:
[Fatal Error] Unit1.pas(6): Circular unit reference to "Unit1"
Вроде всё также? Или всё же нет??

p.s. Если кого обидел - извиняюсь, я не хотел


 
Anatoly Podgoretsky   (2003-09-04 07:52) [55]

Типичная круговая ссылка Unit1 <-> Unit2


 
Palladin   (2003-09-04 07:57) [56]


> Прохожий © (04.09.03 07:49) [54]

А теперь посмотри внимательней на то что тебе привели выше по поводу Uses и найди одно отличие!


 
Прохожий   (2003-09-04 08:12) [57]

Всё, нашёл. Туплю, признаю.


 
Digitman   (2003-09-04 08:14) [58]


> Прохожий


вот и резюме : тебе, видимо, глубоко по барабану, в USES какого раздела - interface или implementation - помещать сссылку на модуль)


 
Прохожий   (2003-09-04 08:29) [59]

>Digitman © (04.09.03 08:14) [58]
вот и резюме : тебе, видимо, глубоко по барабану, в USES какого раздела - interface или implementation - помещать сссылку на модуль)
Дело просто в том, что в той книге, по которой я учусь ни слова о
interface и implementation. Вот и гоню


 
Digitman   (2003-09-04 09:14) [60]


> Прохожий



> Дело просто в том, что в той книге, по которой я учусь ни
> слова о
> interface и implementation


это не книга) можешь смело нанизать ее на гвоздь в сортир)


 
Прохожий   (2003-09-04 09:17) [61]

Книга Митчел Керман DELPHI 5. Вот и обучаюсь читаю форумы, мануал и статьи с этого сайта


 
Digitman   (2003-09-04 09:58) [62]


> Прохожий


и что ? ты хочешь сказать, что этот самый Керман в своем "творении" ни слова не говорит о базовой структуре модуля в ObjectPascal ?


 
N169   (2003-09-04 10:11) [63]

http://delphimaster.net/view/14-1062517360/


 
Прохожий   (2003-09-04 10:46) [64]

>Digitman © (04.09.03 09:58) [62]

и что ? ты хочешь сказать, что этот самый Керман в своем "творении" ни слова не говорит о базовой структуре модуля в ObjectPascal ?
У меня сейчас нет её перед глазами, но читал я её довольно внимательно и именно описания структуры там нет. Обучения идёт по принципу - ты сейчас напиши так, а потом, когда нибудь, поймёшь зачем ты так сделал. В принципе так оно и получаеться, но отсутствие подробной теории делает своё черное дело :(


 
Empleado   (2003-09-04 11:22) [65]

>Digitman © (03.09.03 13:58) [18]
>эт точно) ... поток там или не поток - монопенисуально)
>это ж - азы Паскаля как такового !
>обращение в одном из модулей к идентификатору, описанному в
>другом модуле, требует в первом модуле указания в разделе USES
>имени модуля, где этот ид-р объявлен. За редкими
>специсключениями)

"За редкими специсключениями" - что имеется ввиду?

Gracias


 
Digitman   (2003-09-04 11:24) [66]


> Обучения идёт по принципу - ты сейчас напиши так, а потом,
> когда нибудь, поймёшь зачем ты так сделал


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

)


 
Palladin   (2003-09-04 11:26) [67]

глубоко системный модуль System, его можно не объявлять


 
Digitman   (2003-09-04 11:26) [68]


> Empleado



> "За редкими специсключениями" - что имеется ввиду?


наглядный пример - обращение к идентификаторам, объявленным в модуле System, не требует указания этого модуля в USES


 
Palladin   (2003-09-04 11:27) [69]


> Digitman © (04.09.03 11:24) [66]

Да я думаю в редкой книге по поводу Делфи будет столь детальное описание языка. За языком обращайтесь к соответствующей литературе :)


 
Digitman   (2003-09-04 11:37) [70]


> Empleado


наглядней уже некуда : объявляя свой класс

TMyObject = class(TObject)

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


 
Прохожий   (2003-09-04 12:42) [71]

Нород посоветуйте нормальную литературу по Delphi, а то походу я с этой книгой далеко пойду :)))


 
Прохожий   (2003-09-05 07:27) [72]

Ну неужели никто не знает нормальных книг по Delphi ???


 
Прохожий   (2003-09-05 08:48) [73]

Мастера ???
Не проснулись, что ли ещё :) ?


 
MBo   (2003-09-05 08:53) [74]

Лучшая по Дельфи - Тейксейра, Пачеко.

Хорошие авторы - Калверт, Лишнер, Кэнту.


 
Anatoly Podgoretsky   (2003-09-05 11:41) [75]

У Лишнера великолепна книга по Д2, в России вышло два издания, другой такой он не написал, продолжения являются расширение к первой и должны читаться совместно. Книга настолько популярна, что мне не удалосб ее купить.

Кенту хороша вся серия Mastering Delphi



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

Форум: "Потрепаться";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.71 MB
Время: 0.017 c
7-82527
snake7
2003-07-14 18:38
2003.09.25
Как узнать серийный номер винта


3-82127
andrew_s
2003-09-04 13:59
2003.09.25
открытие базы данных Access используемой другим приложением


1-82297
InspectorNET
2003-09-14 07:36
2003.09.25
Как отобразить в Label титль веб-страницы (показываемой webbrowse


14-82426
sashas
2003-09-08 12:31
2003.09.25
Ужас!!!


14-82476
Карлсон
2003-09-05 16:23
2003.09.25
рассказ Бредбери?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский