Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Может кто знает из Delphi

395  1 2 3 все
  Quo Vadis патриот18.02.08 23:41
Quo Vadis
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 закинуть на кнопку...то всё работает...а мне надо чтобы работала..без нажимания всяких кнопок..
Вышел из потока, остановил его..сделал..своё дело..вернулся обратно в поток..запустил его..
#1 
megabyte завсегдатай19.02.08 07:37
megabyte
NEW 19.02.08 07:37 
в ответ Quo Vadis 18.02.08 23:41, Последний раз изменено 19.02.08 07:51 (megabyte)
Насколько я понял происходит попытка остановить и продолжить поток находясь в самом потоке. ИМХО в коде нитки нужно SetEvent(g_hMyThreadEvent), запостить сообщение (т.е. поставить его в виндовую очередь сообщений, а не вызвать, что то нипа form1.SendMessage), сразу же после WaitForSingleObject(g_hMyThreadEvent, INFINITE).. ну и в вместо Anzeige.Resume - ReleaseEvent(g_hMyThreadEvent)
P.S. Тонкости создания/освобождения события не помню, но идея должна быть понятна.
#2 
VseNikiZanyati гость19.02.08 17:57
NEW 19.02.08 17:57 
в ответ Quo Vadis 18.02.08 23:41, Последний раз изменено 19.02.08 17:58 (VseNikiZanyati)
Привет!
1. А где синхронизация потоков? form1.tuwas(Sender); - если ты в tuwas работаешь с VCL-компонентами, то нужен вызов Synchronize!
2. "здесь выхожу из бесконечной <schleife>" - неоткуда ты не выходишь, код выполняется в этом же потоке, разница лишь в том, что код принадлежит не классу потока!
3. короче, так не программируют потоки: смотри следующее: Synchronize, синхронизация потоквов и события
#3 
  Quo Vadis патриот19.02.08 18:49
Quo Vadis
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;
#4 
  Quo Vadis патриот19.02.08 18:52
Quo Vadis
NEW 19.02.08 18:52 
в ответ megabyte 19.02.08 07:37
и куда тут SetEvent(g_hMyThreadEvent) вставлять??? а как Евент дакларироватъ??
а на кнопке <StartTaste> например
WaitForSingleObject(g_hMyThreadEvent, INFINITE);
какой-то код
ReleaseEvent(g_hMyThreadEvent);
так что ли??
#5 
  Quo Vadis патриот19.02.08 18:53
Quo Vadis
NEW 19.02.08 18:53 
в ответ VseNikiZanyati 19.02.08 17:57
да Вы правы я никуда не выхожу...я неправильно выразился..
я постом выше закинул свой код...
#6 
megabyte завсегдатай19.02.08 20:23
megabyte
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
#7 
  Quo Vadis патриот20.02.08 00:42
Quo Vadis
NEW 20.02.08 00:42 
в ответ megabyte 19.02.08 20:23, Последний раз изменено 20.02.08 00:43 (Quo Vadis)
спасибо за ссылки..очень познавательно...
я кстати нашёл два решения...моей задачи...если интересно могу осветить
одно кстати как раз то, что вы предложили
#8 
megabyte завсегдатай20.02.08 09:06
megabyte
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 только из главной нитки".
#9 
  Quo Vadis патриот20.02.08 11:22
Quo Vadis
NEW 20.02.08 11:22 
в ответ megabyte 20.02.08 09:06, Последний раз изменено 20.02.08 11:29 (Quo Vadis)
спасибо я всё учту...вот только, чем заменить гото и метки???
например while-schleife???
#10 
Murr коренной житель20.02.08 12:35
Murr
NEW 20.02.08 12:35 
в ответ megabyte 20.02.08 09:06
2. Конструкции вида , обычно пишутся как if MyValue then
-----
Можно, но...
Представь, что где-то выяснилось, что фактически MyValue имеет не два значения, а больше?
Или что кто-то решил переопределить его, как пару 1002 и 1003?
Код должен оставаться работоспособным независимо от фактических значений.
Так что наилучшим будет что-то вида: if MyValue = MyValueTrue then...
#11 
megabyte завсегдатай20.02.08 12:37
megabyte
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);
мой пример может содержатся ошибки... не помню синтаксис паскаля...
#12 
megabyte завсегдатай20.02.08 13:13
megabyte
NEW 20.02.08 13:13 
в ответ Murr 20.02.08 12:35
Соглашусь, но с некоторыми оговорками.
1. Это паскаль.. Строгая статичесчкая типизация... Так, что компилер ругнется на смену типа....Думаю, что в С# компилер будет тоже ругаться если нет явного приведения типа.
2. Логичесие переменные (являющиеся членами класса) создаю только в том случае, если третьего не может быть по-умолчанию, напимер, bEnabled. Все остальное только через перечисления.
3. Не панацея, но юнит тесты должны помочь в отливливании таких опусов.
4. Человек решивший переопределить bool на int и присваивающий этой переменно 1002 или, что-то подобное не будет работать в моей команде.
#13 
Murr коренной житель20.02.08 13:31
Murr
NEW 20.02.08 13:31 
в ответ megabyte 20.02.08 13:13
Все остальное только через перечисления.
------
Ну либо через набор констант, если нет перечислений.
4. Человек решивший переопределить bool на int и присваивающий этой переменно 1002 или, что-то подобное не будет работать в моей команде.
------
:) - в моей - будет, если сможет обосновать свои действия.
Бо, пару раз пришлось разбираться с накладками сегментов - много чего менялось непредсказуемо... Пришлось вводить сквозную нумерацию констант и править все хедеры...
#14 
megabyte завсегдатай20.02.08 14:00
megabyte
NEW 20.02.08 14:00 
в ответ Murr 20.02.08 13:31
В ответ на:
:) - в моей - будет, если сможет обосновать свои действия.
Бо, пару раз пришлось разбираться с накладками сегментов - много чего менялось непредсказуемо... Пришлось вводить сквозную нумерацию констант и править все хедеры...

Каждый сам кузнец собственного счастья ;-)
Уверен, что есть ситуации где проще переписать все заново или радикально править текущий код.... Я в случаях, когда первоначальный дизайн какой-то части кода был неудачен, предпочитаю не переписывать все заново, а написать новый, работающий параллельно старому... Свежеписанный код работает с новым кодом, старый постепенно переписывается под новые сущности....
#15 
Murr коренной житель20.02.08 14:22
Murr
NEW 20.02.08 14:22 
в ответ megabyte 20.02.08 14:00
есть ситуации где проще переписать все заново
-----
Если есть на это время. Обычно - времени нет и требуется выполнить заданную модификацию не вдаваясь в детали... :)
#16 
megabyte завсегдатай20.02.08 14:50
megabyte
NEW 20.02.08 14:50 
в ответ Murr 20.02.08 14:22
Недостаточность времени - это уже относится к области планирования проекта, ну или как Матросов на амбразуру, т.е. когда проект сдан клиенту в продакшн и тут выявляется ошибка, которая делает проект неработоспособным (опять же проблемы тестирования и/или непонимания требований клиента)... Ну это уже далековато от вопросов заданных автором топика... ;-)
#17 
AlexNek старожил20.02.08 21:00
AlexNek
NEW 20.02.08 21:00 
в ответ megabyte 20.02.08 09:06
В ответ на:
2. Конструкции вида if MyValue = true then, обычно пишутся как if MyValue then

Это смотря где. Чаще всего заставляют писать if (MyValue != FALSE)
#18 
AlexNek старожил20.02.08 21:05
AlexNek
NEW 20.02.08 21:05 
в ответ megabyte 20.02.08 14:00
В ответ на:
Уверен, что есть ситуации где проще переписать все заново

Все может быть, но чаще всего это невозможно. Хотя самую подлую часть бывает.
#19 
megabyte завсегдатай20.02.08 22:27
megabyte
NEW 20.02.08 22:27 
в ответ AlexNek 20.02.08 21:00
В ответ на:
Это смотря где. Чаще всего заставляют писать if (MyValue != FALSE)

Угу, а if (FALSE != MyValue) еще лучше...
#20 
AlexNek старожил20.02.08 23:08
AlexNek
NEW 20.02.08 23:08 
в ответ megabyte 20.02.08 22:27
В ответ на:
Угу, а if (FALSE != MyValue) еще лучше

Видел и такое, но по счастью не пришлось так писать, для чего нужно то понятно, но не нравится.
#21 
Murr коренной житель21.02.08 18:17
Murr
NEW 21.02.08 18:17 
в ответ AlexNek 20.02.08 23:08
для чего нужно то понятно
-----
Некоторые умники считаю, что указание КОНСТАНТЫ в качестве первого операнда помогает оптимизатору... :)
но не нравится
-----
Угу... мозги плавятся когда приходится разбираться... И ведь что интересно - даешь умнику такой же код, но написанный другим умником - сидит, пыхтит, понять поймет, но к концу дня... Дашь тоже самое в нормальном виде - к обеду пережует и проглотит...
#22 
  Chipolino свой человек21.02.08 18:43
NEW 21.02.08 18:43 
в ответ Murr 21.02.08 18:17
В ответ на:
Некоторые умники считаю, что указание КОНСТАНТЫ в качестве первого операнда помогает оптимизатору... :)

Это делается чтоб случайно не присвоить своей переменной значение .
#23 
megabyte завсегдатай21.02.08 19:13
megabyte
NEW 21.02.08 19:13 
в ответ Murr 21.02.08 18:17
В ответ на:
Некоторые умники считаю, что указание КОНСТАНТЫ в качестве первого операнда помогает оптимизатору... :)

И как они объясняют логику работы оптимизатора в данном конкретном случае? ;-)
В ответ на:
Это делается чтоб случайно не присвоить своей переменной значение .

Там же смайл в конце стоит.
#24 
AlexNek старожил21.02.08 19:30
AlexNek
NEW 21.02.08 19:30 
в ответ Murr 21.02.08 18:17
Некоторые умники считаю, что указание КОНСТАНТЫ в качестве первого операнда помогает оптимизатору.
В ответ на:

Никогда такого не слышал, но скажем, а=2 в ифе бывало, хотя ради этого писать 2==а совсем не хочется, код сильно страшно выглядит.
[цитата]мозги плавятся когда приходится разбираться

Точно, если мне надо в чужом коде разбираться, я его вначале форматирую в привычную форму.
#25 
Murr коренной житель21.02.08 21:22
Murr
NEW 21.02.08 21:22 
в ответ megabyte 21.02.08 19:13
И как они объясняют логику работы оптимизатора в данном конкретном случае? ;-)
------
Хммм... Из того, что удавалось из них выжать - у оптимизатора ограниченная глубина анализа... :)
#26 
megabyte завсегдатай21.02.08 21:27
megabyte
NEW 21.02.08 21:27 
в ответ Murr 21.02.08 21:22
В ответ на:
Хммм... Из того, что удавалось из них выжать - у оптимизатора ограниченная глубина анализа... :)

Это 5.. :-)
#27 
Murr коренной житель21.02.08 21:37
Murr
NEW 21.02.08 21:37 
в ответ AlexNek 21.02.08 19:30
но скажем, а=2 в ифе бывало
-----
Вот тут Я соглашусь с Мегабайтом - человек, написавший а == 2, у меня работать не будет.
Одно из правил кодинга так и гласит - в тексте не может быть цифровых и строковых констант...
А другое его дополняет - нельзя совмещать две операции в одном выражении...
А опечатки - опечатки, да, бывают... К пятнице так вообще можно черте-что накуролесить...
Но на то и тесты и пошаговая отладка... Выживем...
я его вначале форматирую в привычную форму.
------
:))) - иногда случалось дополнительно помогать студентам. Приносят... гхмм... код... частенько
"помогал" следующим образом - форматирую в свой "стандарт"... потом спрашиваю - Продолжать?
Или уже видишь где проблема? - Шутка, но 8 из 10 обычно уже видят... :)
#28 
megabyte завсегдатай21.02.08 22:42
megabyte
NEW 21.02.08 22:42 
в ответ Murr 21.02.08 21:37
В ответ на:
Вот тут Я соглашусь с Мегабайтом - человек, написавший а == 2, у меня работать не будет.

А если он обоснует свои действия? ;-)
В ответ на:
Одно из правил кодинга так и гласит - в тексте не может быть цифровых и строковых констант...

Я пошел топиться... Нашел у себя в коде строку if (strType.CmpNoCase(g_TypeMap[iCount].m_strName) == 0) { .. ;-)
stl::map cмотрелся бы лучше, но овчинка выделки не стоит.. В g_TypeMap всего пара или тройка записей.. Ну может еще пара добавится..
В ответ на:
А другое его дополняет - нельзя совмещать две операции в одном выражении...

И такое нельзя? if (ptr != NULL && ptrl->Enabled()) {
В качестве пОнта.. ;-) Всегда умиляли люди использующие == в сравнении чисел с плавающей запятой...
#29 
Murr коренной житель21.02.08 23:06
Murr
NEW 21.02.08 23:06 
в ответ megabyte 21.02.08 22:42
А если он обоснует свои действия? ;-)
------
Ну если обоснует, то... ;-)
Я пошел топиться...
------
Рано. В Сишном кодинге разрешен ноль, в VB - единица...
И такое нельзя? if (ptr != NULL && ptrl->Enabled()) {
-----
:) - нельзя.
Причем по двум причинам
- ptrl таки может быть нулем (думаю - опечатка - ptr)
- Enabled() потенциально может менять состояние объекта (можно заменить пропертью или кастингом - тогда ответственность на кодере)
Всегда умиляли люди
-----
Посмотри чуток ранее - народ смеялся над тем, что одно из требований было - иметь отдельный тип для каждой сущности данных. А в результате, в частности, два врапированных float'a как раз корректно сравнивались по == :) и даже приемлемая точность задавалась без проблем...
#30 
AlexNek старожил21.02.08 23:36
AlexNek
NEW 21.02.08 23:36 
в ответ Murr 21.02.08 21:37
В ответ на:
в тексте не может быть цифровых и строковых констант

Я же не написал что это кусок кода, да и разве а = ХЕР было бы понятней для примера.
В ответ на:
Но на то и тесты и пошаговая отладка

Да такую фигню нормальный компайлер выловит и спросит, а ты не дурак?
В ответ на:
иногда случалось дополнительно помогать студентам.

Да я вообще не понимаю кто их учит
#31 
megabyte завсегдатай21.02.08 23:46
megabyte
NEW 21.02.08 23:46 
в ответ Murr 21.02.08 23:06
В ответ на:
- ptrl таки может быть нулем (думаю - опечатка - ptr)

Так точно, опечатка..
В ответ на:
- Enabled() потенциально может менять состояние объекта (можно заменить пропертью или кастингом - тогда ответственность на кодере)

Для этого в С++ есть замечательный описатель const.. его отсутвствие в С# меня добивает... Можно назвать паранойей, но я локальные переменные объявляю в виде const bool bEnabled = ....;
#32 
Simple Nothing is f*cked22.02.08 10:24
Simple
NEW 22.02.08 10:24 
в ответ megabyte 21.02.08 23:46
В ответ на:
Для этого в С++ есть замечательный описатель const.. его отсутвствие в С# меня добивает... Можно назвать паранойей, но я локальные переменные объявляю в виде const bool bEnabled = ....;

Meyers, Effective C++:
В ответ на:
use const whenever possible

:)
#33 
Simple Nothing is f*cked22.02.08 10:25
Simple
NEW 22.02.08 10:25 
в ответ Chipolino 21.02.08 18:43
Это единственное объяснение?.. Мне этот стиль тоже жутко не нравится.
#34 
Simple Nothing is f*cked22.02.08 10:28
Simple
NEW 22.02.08 10:28 
в ответ AlexNek 21.02.08 19:30
В ответ на:
Точно, если мне надо в чужом коде разбираться, я его вначале форматирую в привычную форму.

Я тоже (есть у меня макро для VC). Но как-то вышел геморрой: переформатировал я код, чтобы было легче разобраться, и добавил в него фичу. Коллега, сделавший то же, но без переформатирования, попытался добавить мои изменения в свою ветку и страшно ругался :)
#35 
megabyte завсегдатай22.02.08 10:55
megabyte
NEW 22.02.08 10:55 
в ответ Simple 22.02.08 10:24
Кстати, вопрос тем кто листал обе книжки... Effective C# такая же полезная как и Effective C++?
#36 
Murr коренной житель22.02.08 17:45
Murr
NEW 22.02.08 17:45 
в ответ AlexNek 21.02.08 23:36
Да такую фигню нормальный компайлер выловит и спросит, а ты не дурак?
-----
Кто же его об этом просит? :) По крайней мере в старые времена, когда Я был совсем глупым, Я это дело отключал - слишком уж много крику было... Потом одумался... пришлось... и стал писать так, что компайлеру ругаться не приходится... Так что что есть оно, что нету - одинаково... :)
было бы понятней для примера.
------
По крайней мере это бы подтверждало, что в коде нет констант. Легче без них, хотя - надо привыкнуть, но потом - много легче...
я вообще не понимаю кто их учит
------
Как всегда - тот, кто не умеет делать код...
#37 
  scorpi_ скептик22.02.08 17:55
NEW 22.02.08 17:55 
в ответ Simple 22.02.08 10:28
В ответ на:
Коллега, сделавший то же, но без переформатирования, попытался добавить мои изменения в свою ветку и страшно ругался :)

Прикрутите astyle к svn.
#38 
  scorpi_ скептик22.02.08 18:01
NEW 22.02.08 18:01 
в ответ Chipolino 21.02.08 18:43
В ответ на:
Это делается чтоб случайно не присвоить своей переменной значение .

Этого можно избежать и другим путём: 0. Активировать все предупреждения. 1. При компиляции всегда доводить программу до состояния, когда предупреждений нет вообще. 2. Никогда не присваивать в условиях. 3. Тогда эта ошибка отлавливается через - "warning C4706: assignment within conditional expression".
#39 
Simple Nothing is f*cked22.02.08 18:03
Simple
NEW 22.02.08 18:03 
в ответ scorpi_ 22.02.08 17:55
Я бы уже давно прикрутил все мыслимое и немыслимое, если бы это зависело от меня. Даже STL толком не дают пользовать :(
#40 
  scorpi_ скептик22.02.08 18:05
NEW 22.02.08 18:05 
в ответ Simple 22.02.08 18:03
Может нафиг её, такую работу?
#41 
AlexNek старожил22.02.08 18:12
AlexNek
NEW 22.02.08 18:12 
в ответ Simple 22.02.08 10:28
В ответ на:
Коллега, сделавший то же, но без переформатирования, попытался добавить мои изменения в свою ветку и страшно ругался

На то что код было удобнее смотреть, ругался?
Привык небось к декларированному бардаку.
#42 
Simple Nothing is f*cked22.02.08 19:46
Simple
NEW 22.02.08 19:46 
в ответ scorpi_ 22.02.08 18:05
В поисках.
#43 
Simple Nothing is f*cked22.02.08 19:47
Simple
NEW 22.02.08 19:47 
в ответ AlexNek 22.02.08 18:12
Он сравнивал BC, чтобы понять, где я что-то менял, а он показывал все те места, где прошлось форматирование :)
#44 
AlexNek старожил22.02.08 20:12
AlexNek
NEW 22.02.08 20:12 
в ответ Simple 22.02.08 19:47
А биты где?
#45 
Simple Nothing is f*cked22.02.08 20:22
Simple
NEW 22.02.08 20:22 
в ответ AlexNek 22.02.08 20:12
Что?
#46 
AlexNek старожил22.02.08 20:31
AlexNek
NEW 22.02.08 20:31 
в ответ Simple 22.02.08 20:22
Ну ты же про форматирование писал, биты то должны были остаться. Да и в театре бывает подобное говорят, это что-то типа "бить или не бить вот в чем вопрос"
#47 
Simple Nothing is f*cked22.02.08 20:37
Simple
NEW 22.02.08 20:37 
в ответ AlexNek 22.02.08 20:31
Я имел в виду форматирование кода :)
#48 
AlexNek старожил22.02.08 21:04
AlexNek
NEW 22.02.08 21:04 
в ответ Simple 22.02.08 20:37
Ах зо, теперь въехал. А я думал ты что-то по поводу кошки. Как раз из-за этого продукцион код практически никогда не переформатирую.
Как раз сегодня мучился с сравнением двух ХМЛ файлов в спец. редакторе. Он гад показывал, что я почти все абзацы поменял. Хорошо догадался просто текст сравнить. Так этот гад редактор понасовал в каждый абзац уникальный номер, которые естественно не показывал. Пришлось ручками все номера назад убирать.
#49 
1 2 3 все