Login
Может кто знает из Delphi
NEW 18.02.08 23:41
Неуверен, что тут естъ дельфисты..:)) но всё же...
вопрос...
type TAnzeigeTread=class(TThread)
Sender: TObject;
constructor create(CreateSuspended : boolean); virtual;
protected
procedure execute; override;
procedure Doetwas;virtual; abstract;
{ Public-Deklarationen }
end;
TMyThread.class
procedure TAnzeigeThread.Execute;
begin
while(not Terminated)do
begin
// delaet vsjakuju erundu...
if a=true then
form1.tuwas(Sender); ---здесь выхожу из бесконечной <schleife> и иду делать <procedure tuwas (Sender:tObject);
end;
unit2
var
Anzeige:TAnzeigeThread
procedure tuwas (Sender:Object);
Anzeige.suspend; // --здесъ остановил поток...
делаем что-то..
цделали
а:=false;
И как теперь мне вернуться в поток TAnzeigeThread вернее его вывести из паузы???
Anzeige.Resume; подвешивает программу..
end;
если Anzeige.Resume закинуть на кнопку...то всё работает...а мне надо чтобы работала..без нажимания всяких кнопок..
Вышел из потока, остановил его..сделал..своё дело..вернулся обратно в поток..запустил его..
вопрос...
type TAnzeigeTread=class(TThread)
Sender: TObject;
constructor create(CreateSuspended : boolean); virtual;
protected
procedure execute; override;
procedure Doetwas;virtual; abstract;
{ Public-Deklarationen }
end;
TMyThread.class
procedure TAnzeigeThread.Execute;
begin
while(not Terminated)do
begin
// delaet vsjakuju erundu...
if a=true then
form1.tuwas(Sender); ---здесь выхожу из бесконечной <schleife> и иду делать <procedure tuwas (Sender:tObject);
end;
unit2
var
Anzeige:TAnzeigeThread
procedure tuwas (Sender:Object);
Anzeige.suspend; // --здесъ остановил поток...
делаем что-то..
цделали
а:=false;
И как теперь мне вернуться в поток TAnzeigeThread вернее его вывести из паузы???
Anzeige.Resume; подвешивает программу..
end;
если Anzeige.Resume закинуть на кнопку...то всё работает...а мне надо чтобы работала..без нажимания всяких кнопок..
Вышел из потока, остановил его..сделал..своё дело..вернулся обратно в поток..запустил его..
NEW 19.02.08 07:37
in Antwort Quo Vadis 18.02.08 23:41, Zuletzt geändert 19.02.08 07:51 (megabyte)
Насколько я понял происходит попытка остановить и продолжить поток находясь в самом потоке. ИМХО в коде нитки нужно SetEvent(g_hMyThreadEvent), запостить сообщение (т.е. поставить его в виндовую очередь сообщений, а не вызвать, что то нипа form1.SendMessage), сразу же после WaitForSingleObject(g_hMyThreadEvent, INFINITE).. ну и в вместо Anzeige.Resume - ReleaseEvent(g_hMyThreadEvent)
P.S. Тонкости создания/освобождения события не помню, но идея должна быть понятна.
P.S. Тонкости создания/освобождения события не помню, но идея должна быть понятна.
NEW 19.02.08 17:57
in Antwort Quo Vadis 18.02.08 23:41, Zuletzt geändert 19.02.08 17:58 (VseNikiZanyati)
Привет!
1. А где синхронизация потоков? form1.tuwas(Sender); - если ты в tuwas работаешь с VCL-компонентами, то нужен вызов Synchronize!
2. "здесь выхожу из бесконечной <schleife>" - неоткуда ты не выходишь, код выполняется в этом же потоке, разница лишь в том, что код принадлежит не классу потока!
3. короче, так не программируют потоки: смотри следующее: Synchronize, синхронизация потоквов и события
1. А где синхронизация потоков? form1.tuwas(Sender); - если ты в tuwas работаешь с VCL-компонентами, то нужен вызов Synchronize!
2. "здесь выхожу из бесконечной <schleife>" - неоткуда ты не выходишь, код выполняется в этом же потоке, разница лишь в том, что код принадлежит не классу потока!
3. короче, так не программируют потоки: смотри следующее: Synchronize, синхронизация потоквов и события
NEW 19.02.08 18:49
in Antwort megabyte 19.02.08 07:37
Вы всё правильно поняли...
procedure TMyThreads.Execute;
var
Label 10,20,30;
begin
Form1.Edit11.Text:='Ende';
while(not Terminated)do
begin
10:Application.ProcessMessages;
If StopVariable=true then
begin
CP.RTS(1);
CP.SENDSTRING('sta,g'+chr(13)+chr(10));
status:=cp.READSTRING();
// If trim(Status)='00' then goto 10;
If trim(Status)='E 01' then goto 10;
If trim(Status)='' then goto 10;
Form1.Edit6.Text:='begin';
Sleep(100);
If (trim(Status)='04') and (StopJa=true) then
begin
Form1.StopTasteClick(Sender);
end;
If (trim(Status)='00') and (StopJa=true) then
begin
Form1.StopTasteClick(Sender);
end;
If (trim(Status)='02')and (StartJa=true) then
begin
Form1.StartTasteClick(Sender);
end;
/// Die letzten aktuellen Messwerten bekommen
20: CP.SENDSTRING('dis,g'+chr(13)+chr(10));
Distanz:=cp.READSTRING();
Distanz:=trim(Distanz);
If (length(Distanz)<11) or (length(Distanz)>11) then goto 20;
Sleep(50);
Test:='okkkkkkkkkkkkkk';
30: CP.SENDSTRING('kmh,g'+chr(13)+chr(10));
Speed:=cp.READSTRING();
Speed:=trim(Speed);
If (length(Speed)<3) and (length(Speed)>5) then goto 30;
Form1.Edit6.Text:='untennnnnnnnnnn';
end ;
Synchronize(Go);
end;
end;
procedure TMyThreads.Execute;
var
Label 10,20,30;
begin
Form1.Edit11.Text:='Ende';
while(not Terminated)do
begin
10:Application.ProcessMessages;
If StopVariable=true then
begin
CP.RTS(1);
CP.SENDSTRING('sta,g'+chr(13)+chr(10));
status:=cp.READSTRING();
// If trim(Status)='00' then goto 10;
If trim(Status)='E 01' then goto 10;
If trim(Status)='' then goto 10;
Form1.Edit6.Text:='begin';
Sleep(100);
If (trim(Status)='04') and (StopJa=true) then
begin
Form1.StopTasteClick(Sender);
end;
If (trim(Status)='00') and (StopJa=true) then
begin
Form1.StopTasteClick(Sender);
end;
If (trim(Status)='02')and (StartJa=true) then
begin
Form1.StartTasteClick(Sender);
end;
/// Die letzten aktuellen Messwerten bekommen
20: CP.SENDSTRING('dis,g'+chr(13)+chr(10));
Distanz:=cp.READSTRING();
Distanz:=trim(Distanz);
If (length(Distanz)<11) or (length(Distanz)>11) then goto 20;
Sleep(50);
Test:='okkkkkkkkkkkkkk';
30: CP.SENDSTRING('kmh,g'+chr(13)+chr(10));
Speed:=cp.READSTRING();
Speed:=trim(Speed);
If (length(Speed)<3) and (length(Speed)>5) then goto 30;
Form1.Edit6.Text:='untennnnnnnnnnn';
end ;
Synchronize(Go);
end;
end;
NEW 19.02.08 18:52
in Antwort megabyte 19.02.08 07:37
и куда тут SetEvent(g_hMyThreadEvent) вставлять??? а как Евент дакларироватъ??
а на кнопке <StartTaste> например
WaitForSingleObject(g_hMyThreadEvent, INFINITE);
какой-то код
ReleaseEvent(g_hMyThreadEvent);
так что ли??
а на кнопке <StartTaste> например
WaitForSingleObject(g_hMyThreadEvent, INFINITE);
какой-то код
ReleaseEvent(g_hMyThreadEvent);
так что ли??
NEW 19.02.08 18:53
in Antwort VseNikiZanyati 19.02.08 17:57
NEW 19.02.08 20:23
in Antwort Quo Vadis 19.02.08 18:53
Посмотрел как реализована высокоуровневая поддрежка синхронизации потоков в Delphi. Мой совет можно забыть и лучше обратиться к совету VseNikiZanyati. Можно также почитать
http://www.delphimaster.ru/articles/thread/index.html
и
http://www.delphimaster.ru/articles/panov/index.html
http://www.delphimaster.ru/articles/thread/index.html
и
http://www.delphimaster.ru/articles/panov/index.html
NEW 20.02.08 00:42
in Antwort megabyte 19.02.08 20:23, Zuletzt geändert 20.02.08 00:43 (Quo Vadis)
спасибо за ссылки..очень познавательно...
я кстати нашёл два решения...моей задачи...если интересно могу осветить
одно кстати как раз то, что вы предложили
я кстати нашёл два решения...моей задачи...если интересно могу осветить

одно кстати как раз то, что вы предложили
NEW 20.02.08 09:06
in Antwort Quo Vadis 20.02.08 00:42
Отлично.. С Вашего позвовления несколько рекомендаций к улучшению Вашего кода
1. Избавтесь от меток и goto
2. Конструкции вида if MyValue = true then, обычно пишутся как if MyValue then
3. Больше пользуйтесь локальными переменными. Обилие trim(Status) режет глаз, да и производительность может быть хуже чем в случае strTrimmedStatus = trim(Status);
4. Явыный вызов гуевых ф-ций из нитки отличной от главной приводит к непредсказуемым результатам. Можно принять за правило "Вся работа с GUI только из главной нитки".
1. Избавтесь от меток и goto
2. Конструкции вида if MyValue = true then, обычно пишутся как if MyValue then
3. Больше пользуйтесь локальными переменными. Обилие trim(Status) режет глаз, да и производительность может быть хуже чем в случае strTrimmedStatus = trim(Status);
4. Явыный вызов гуевых ф-ций из нитки отличной от главной приводит к непредсказуемым результатам. Можно принять за правило "Вся работа с GUI только из главной нитки".
NEW 20.02.08 11:22
in Antwort megabyte 20.02.08 09:06, Zuletzt geändert 20.02.08 11:29 (Quo Vadis)
NEW 20.02.08 12:35
in Antwort megabyte 20.02.08 09:06
2. Конструкции вида , обычно пишутся как if MyValue then
-----
Можно, но...
Представь, что где-то выяснилось, что фактически MyValue имеет не два значения, а больше?
Или что кто-то решил переопределить его, как пару 1002 и 1003?
Код должен оставаться работоспособным независимо от фактических значений.
Так что наилучшим будет что-то вида: if MyValue = MyValueTrue then...
-----
Можно, но...
Представь, что где-то выяснилось, что фактически MyValue имеет не два значения, а больше?
Или что кто-то решил переопределить его, как пару 1002 и 1003?
Код должен оставаться работоспособным независимо от фактических значений.
Так что наилучшим будет что-то вида: if MyValue = MyValueTrue then...
NEW 20.02.08 12:37
in Antwort Quo Vadis 20.02.08 11:22
Да...
Ну например
30: CP.SENDSTRING('kmh,g'+chr(13)+chr(10));
Speed:=cp.READSTRING();
Speed:=trim(Speed);
If (length(Speed)<3) and (length(Speed)>5) then goto 30;
заменяется на
do
CP.SENDSTRING('kmh,g'+chr(13)+chr(10));
Speed:=cp.READSTRING();
Speed:=trim(Speed);
until (length(Speed)>=3) оr (length(Speed)<=5);
мой пример может содержатся ошибки... не помню синтаксис паскаля...
Ну например
30: CP.SENDSTRING('kmh,g'+chr(13)+chr(10));
Speed:=cp.READSTRING();
Speed:=trim(Speed);
If (length(Speed)<3) and (length(Speed)>5) then goto 30;
заменяется на
do
CP.SENDSTRING('kmh,g'+chr(13)+chr(10));
Speed:=cp.READSTRING();
Speed:=trim(Speed);
until (length(Speed)>=3) оr (length(Speed)<=5);
мой пример может содержатся ошибки... не помню синтаксис паскаля...
NEW 20.02.08 13:13
in Antwort Murr 20.02.08 12:35
Соглашусь, но с некоторыми оговорками.
1. Это паскаль.. Строгая статичесчкая типизация... Так, что компилер ругнется на смену типа....Думаю, что в С# компилер будет тоже ругаться если нет явного приведения типа.
2. Логичесие переменные (являющиеся членами класса) создаю только в том случае, если третьего не может быть по-умолчанию, напимер, bEnabled. Все остальное только через перечисления.
3. Не панацея, но юнит тесты должны помочь в отливливании таких опусов.
4. Человек решивший переопределить bool на int и присваивающий этой переменно 1002 или, что-то подобное не будет работать в моей команде.
1. Это паскаль.. Строгая статичесчкая типизация... Так, что компилер ругнется на смену типа....Думаю, что в С# компилер будет тоже ругаться если нет явного приведения типа.
2. Логичесие переменные (являющиеся членами класса) создаю только в том случае, если третьего не может быть по-умолчанию, напимер, bEnabled. Все остальное только через перечисления.
3. Не панацея, но юнит тесты должны помочь в отливливании таких опусов.
4. Человек решивший переопределить bool на int и присваивающий этой переменно 1002 или, что-то подобное не будет работать в моей команде.
20.02.08 13:31
in Antwort megabyte 20.02.08 13:13
Все остальное только через перечисления.
------
Ну либо через набор констант, если нет перечислений.
4. Человек решивший переопределить bool на int и присваивающий этой переменно 1002 или, что-то подобное не будет работать в моей команде.
------
:) - в моей - будет, если сможет обосновать свои действия.
Бо, пару раз пришлось разбираться с накладками сегментов - много чего менялось непредсказуемо... Пришлось вводить сквозную нумерацию констант и править все хедеры...
------
Ну либо через набор констант, если нет перечислений.
4. Человек решивший переопределить bool на int и присваивающий этой переменно 1002 или, что-то подобное не будет работать в моей команде.
------
:) - в моей - будет, если сможет обосновать свои действия.
Бо, пару раз пришлось разбираться с накладками сегментов - много чего менялось непредсказуемо... Пришлось вводить сквозную нумерацию констант и править все хедеры...
NEW 20.02.08 14:00
Каждый сам кузнец собственного счастья ;-)
Уверен, что есть ситуации где проще переписать все заново или радикально править текущий код.... Я в случаях, когда первоначальный дизайн какой-то части кода был неудачен, предпочитаю не переписывать все заново, а написать новый, работающий параллельно старому... Свежеписанный код работает с новым кодом, старый постепенно переписывается под новые сущности....
in Antwort Murr 20.02.08 13:31
В ответ на:
:) - в моей - будет, если сможет обосновать свои действия.
Бо, пару раз пришлось разбираться с накладками сегментов - много чего менялось непредсказуемо... Пришлось вводить сквозную нумерацию констант и править все хедеры...
:) - в моей - будет, если сможет обосновать свои действия.
Бо, пару раз пришлось разбираться с накладками сегментов - много чего менялось непредсказуемо... Пришлось вводить сквозную нумерацию констант и править все хедеры...
Каждый сам кузнец собственного счастья ;-)
Уверен, что есть ситуации где проще переписать все заново или радикально править текущий код.... Я в случаях, когда первоначальный дизайн какой-то части кода был неудачен, предпочитаю не переписывать все заново, а написать новый, работающий параллельно старому... Свежеписанный код работает с новым кодом, старый постепенно переписывается под новые сущности....
NEW 20.02.08 14:22
in Antwort megabyte 20.02.08 14:00
есть ситуации где проще переписать все заново
-----
Если есть на это время. Обычно - времени нет и требуется выполнить заданную модификацию не вдаваясь в детали... :)
-----
Если есть на это время. Обычно - времени нет и требуется выполнить заданную модификацию не вдаваясь в детали... :)
NEW 20.02.08 14:50
in Antwort Murr 20.02.08 14:22
Недостаточность времени - это уже относится к области планирования проекта, ну или как Матросов на амбразуру, т.е. когда проект сдан клиенту в продакшн и тут выявляется ошибка, которая делает проект неработоспособным (опять же проблемы тестирования и/или непонимания требований клиента)... Ну это уже далековато от вопросов заданных автором топика... ;-)
NEW 20.02.08 21:00
Это смотря где. Чаще всего заставляют писать if (MyValue != FALSE)
in Antwort megabyte 20.02.08 09:06
В ответ на:
2. Конструкции вида if MyValue = true then, обычно пишутся как if MyValue then
2. Конструкции вида if MyValue = true then, обычно пишутся как if MyValue then
Это смотря где. Чаще всего заставляют писать if (MyValue != FALSE)
NEW 20.02.08 21:05
Все может быть, но чаще всего это невозможно. Хотя самую подлую часть бывает.
in Antwort megabyte 20.02.08 14:00
В ответ на:
Уверен, что есть ситуации где проще переписать все заново
Уверен, что есть ситуации где проще переписать все заново
Все может быть, но чаще всего это невозможно. Хотя самую подлую часть бывает.
NEW 20.02.08 22:27
Угу, а if (FALSE != MyValue) еще лучше...
in Antwort AlexNek 20.02.08 21:00
В ответ на:
Это смотря где. Чаще всего заставляют писать if (MyValue != FALSE)
Это смотря где. Чаще всего заставляют писать if (MyValue != FALSE)
Угу, а if (FALSE != MyValue) еще лучше...