Вход на сайт
Может кто знает из Delphi
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
Насколько я понял происходит попытка остановить и продолжить поток находясь в самом потоке. ИМХО в коде нитки нужно SetEvent(g_hMyThreadEvent), запостить сообщение (т.е. поставить его в виндовую очередь сообщений, а не вызвать, что то нипа form1.SendMessage), сразу же после WaitForSingleObject(g_hMyThreadEvent, INFINITE).. ну и в вместо Anzeige.Resume - ReleaseEvent(g_hMyThreadEvent)
P.S. Тонкости создания/освобождения события не помню, но идея должна быть понятна.
P.S. Тонкости создания/освобождения события не помню, но идея должна быть понятна.
NEW 19.02.08 17:57
Привет!
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
в ответ 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 20:23
в ответ 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 09:06
в ответ 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 12:35
в ответ 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
в ответ 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
в ответ Murr 20.02.08 12:35
Соглашусь, но с некоторыми оговорками.
1. Это паскаль.. Строгая статичесчкая типизация... Так, что компилер ругнется на смену типа....Думаю, что в С# компилер будет тоже ругаться если нет явного приведения типа.
2. Логичесие переменные (являющиеся членами класса) создаю только в том случае, если третьего не может быть по-умолчанию, напимер, bEnabled. Все остальное только через перечисления.
3. Не панацея, но юнит тесты должны помочь в отливливании таких опусов.
4. Человек решивший переопределить bool на int и присваивающий этой переменно 1002 или, что-то подобное не будет работать в моей команде.
1. Это паскаль.. Строгая статичесчкая типизация... Так, что компилер ругнется на смену типа....Думаю, что в С# компилер будет тоже ругаться если нет явного приведения типа.
2. Логичесие переменные (являющиеся членами класса) создаю только в том случае, если третьего не может быть по-умолчанию, напимер, bEnabled. Все остальное только через перечисления.
3. Не панацея, но юнит тесты должны помочь в отливливании таких опусов.
4. Человек решивший переопределить bool на int и присваивающий этой переменно 1002 или, что-то подобное не будет работать в моей команде.
NEW 20.02.08 13:31
в ответ megabyte 20.02.08 13:13
Все остальное только через перечисления.
------
Ну либо через набор констант, если нет перечислений.
4. Человек решивший переопределить bool на int и присваивающий этой переменно 1002 или, что-то подобное не будет работать в моей команде.
------
:) - в моей - будет, если сможет обосновать свои действия.
Бо, пару раз пришлось разбираться с накладками сегментов - много чего менялось непредсказуемо... Пришлось вводить сквозную нумерацию констант и править все хедеры...
------
Ну либо через набор констант, если нет перечислений.
4. Человек решивший переопределить bool на int и присваивающий этой переменно 1002 или, что-то подобное не будет работать в моей команде.
------
:) - в моей - будет, если сможет обосновать свои действия.
Бо, пару раз пришлось разбираться с накладками сегментов - много чего менялось непредсказуемо... Пришлось вводить сквозную нумерацию констант и править все хедеры...
NEW 20.02.08 14:00
Каждый сам кузнец собственного счастья ;-)
Уверен, что есть ситуации где проще переписать все заново или радикально править текущий код.... Я в случаях, когда первоначальный дизайн какой-то части кода был неудачен, предпочитаю не переписывать все заново, а написать новый, работающий параллельно старому... Свежеписанный код работает с новым кодом, старый постепенно переписывается под новые сущности....
в ответ Murr 20.02.08 13:31
В ответ на:
:) - в моей - будет, если сможет обосновать свои действия.
Бо, пару раз пришлось разбираться с накладками сегментов - много чего менялось непредсказуемо... Пришлось вводить сквозную нумерацию констант и править все хедеры...
:) - в моей - будет, если сможет обосновать свои действия.
Бо, пару раз пришлось разбираться с накладками сегментов - много чего менялось непредсказуемо... Пришлось вводить сквозную нумерацию констант и править все хедеры...
Каждый сам кузнец собственного счастья ;-)
Уверен, что есть ситуации где проще переписать все заново или радикально править текущий код.... Я в случаях, когда первоначальный дизайн какой-то части кода был неудачен, предпочитаю не переписывать все заново, а написать новый, работающий параллельно старому... Свежеписанный код работает с новым кодом, старый постепенно переписывается под новые сущности....
NEW 20.02.08 14:50
в ответ Murr 20.02.08 14:22
Недостаточность времени - это уже относится к области планирования проекта, ну или как Матросов на амбразуру, т.е. когда проект сдан клиенту в продакшн и тут выявляется ошибка, которая делает проект неработоспособным (опять же проблемы тестирования и/или непонимания требований клиента)... Ну это уже далековато от вопросов заданных автором топика... ;-)