![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вывод из дочернего потока на форму значения [D2005, XP]
npr2 © (2008-04-29 12:59:00)Только начинаю работать с потоками. Может и не по адресу обращаюсь.
Создала форму. Создала дочерний поток в котором читаю данные из сом-порта. Нужно после обработки этих данных, выложить в Edit.text значение этой переменной. Делаю так
type
TCommThread=class(TThread)
private
Stroka:string;
HFile:TextFile;
Procedure ShowStroka;
protected
Procedure Execute; override;
end;
var
Scale_Form: TScale_Form;
TT:TCommThread;
Это описание потока.
Запускаю поток при создании формы TT:=TCommThread.Create(False);
procedure TCommThread.Execute;
var
begin
...
stroka:=Separ_float(w1);
TT.Synchronize(ShowStroka);
...
end;
procedure TCommThread.ShowStroka;
begin
Scale_Form.Edit1.Text:=Stroka;
end;
При выводе переменной задача вылетает по ошибке Access Violation at address. Если пытаюсь выводить значение в заголовок окна, то вообще ничего не происходит.
Где я ошибаюсь?
ANB (2008-04-30 14:30:00) [1]
> пытаюсь синхронно читать все отчеты в отдельном потоке
Судя по контексту, он собирается читать "отчеты" весов из ком-порта.
Сергей М. (2008-04-30 14:18:00) [2]
> оператор запускал еще что-то длительное по времени (формирование
> отчета) параллельно с заездом авто на весы
Чему ж тут удивляться ?
Разумеется, если формирование и вывод отчета осуществляется в осн.потоке (это у тебя, очевидно, синхронная блокирующая операция), то в этот момент он никак не реагирует на сообщения дополнительных потоков, в т.ч. потока, работающего с портом весов.
> пытаюсь синхронно читать все отчеты в отдельном потоке
Не читать, а формировать.
ANB (2008-04-30 13:45:00) [3]
> npr2 (30.04.08 12:56) [24]
Может все равно заклинить, если отчетом пожрешь время процессора и он на компе один.
npr2 (2008-04-30 12:56:00) [4]Это рабочее место оператора весовой на угольном складе на разрезе. Оператор ведет кучу справочников, учет путевых листов, ТТН, печатаеи много разных ртчетов по своей работе. И постоянно открыто дочернее окно взвешивания автомобилей, где я и создаю дочерний поток по чтению из сом порта. Раньше читала без потока асинхронно раз в сек, но прибор выдает 20-60 отсчетов в сек. На экране вес выдавался с задержкой. Были проблемы, когда оператор запускал еще что-то длительное по времени (формирование отчета) параллельно с заездом авто на весы. Сейчас пытаюсь синхронно читать все отчеты в отдельном потоке.
Спасибо всем за советы. С праздником!
ANB (2008-04-30 12:34:00) [5]
> npr2 (30.04.08 11:13) [20]
> в потоке читаю сом синхронно, но думаю и асинхронно тоже
> можно.
Зазвиняюсь. Похоже, в Вашем случае нужен доп.поток.
ЗЫ. Всю задачу лучше сразу описывать.
ЗЫЫ. Тогда надо учится корректно работать с потоками.
Evgeny V (2008-04-30 11:50:00) [6]
> npr2 (30.04.08 11:13) [20]
Асинхронные операции могут обеспечить более быструю реакцию на другие события порта(изменение состояния управляющих сигналов например и т.п.), если конечно такая реакция нужна. На мой взгляд и при синхронной и при асинхронной работе с портом работа в отдельном потоке предпочтительней, хотя и возможны задачи, где этого не надо.
Сергей М. (2008-04-30 11:18:00) [7]
> асинхронно тоже можно
А зачем ?
Ипользование в потоке (в любом, будь то основной или дополнительный) асинхронного транспорта имеет смысл только если поток кроме транспортных решает и иные задачи. Ну и еще если отмена синхронных блокирующих транспортных операций по объективным причинам не возможна, как, например, операции с пайпами в раде виндовых ОС.
npr2 (2008-04-30 11:13:00) [8]в потоке читаю сом синхронно, но думаю и асинхронно тоже можно.
Сергей М. (2008-04-30 08:57:00) [9]
> это противоречит друг другу?
Нисколько.
Evgeny V (2008-04-30 08:36:00) [10]
> Германн © (29.04.08 15:51) [16]
> И всё таки лучше работать с СОМ-портом асинхронно, а не
> в потоке.
Асинхронно(overlapped) и поток(Thread) -это противоречит друг другу? Или я чего-то упустил? Или речь о частном случае?
Пост не в пику ответу, а просто как желание обсудить и узнать что-то , что я возможно пропустил в этой области...
npr2 (2008-04-30 05:35:00) [11]Большое спасибо!!
Scale_Form := Self; решило проблему.
А можно варианты работы с СОМ портом? Просто это задача автоматического взвешивания автомобилей на весах. Весь алгоритм построен на изменениях показания веса с прибора асинхронно. Раньше при пустых весах брали вес по таймеру раз в секунду, при заезде - снимали все показания с прибора, но тогда захватывались ресурсы компа, оператор ничего не может сделать. Если до этого момента (заезда) был запущен сложный отчет, то было плохо - все подвисало. Думала, что так можно было решить эту проблему.
Германн (2008-04-29 15:51:00) [12]И всё таки лучше работать с СОМ-портом асинхронно, а не в потоке.
Игорь Шевченко (2008-04-29 15:32:00) [13]
> TT.Synchronize(ShowStroka);
TT убрать однозначно.
Если хочется запускать поток из FormCreate, то первой строчкой
там должно стоять
Scale_Form := Self;
Но лучше не запускать поток из FormCreate
Сергей М. (2008-04-29 15:25:00) [14]
> вовсе не 0 выдает
Это если создавать с пом. Application.CreateForm
А если Form1 := TMyForm.Create(..), то как раз эта ситуация и наблюдается.
sniknik (2008-04-29 15:07:00) [15]> ... потому как все это чудесатое действо происходит в OnCreate формы.
думаю, что это всетаки не та форма... (показывается одна, пишется в/проверяется другая)
т.к.
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(IntToStr(Integer(Form1)));
end;
вовсе не 0 выдает.
Сергей М. (2008-04-29 14:47:00) [16]
> т.е. форма не создана (=nil)
Форма-то уже и создана, да вот ссылка на нее еще не попала в Scale_Form, потому как все это чудесатое действо происходит в OnCreate формы.
А там стартует поток, который запросто может успеть обратиться к переменной Scale_Form (что и наблюдается), которая в этот момент еще равна nil и которая будет инициализирована лишь после завершения работы конструирующего форму метода.
Anatoly Podgoretsky (2008-04-29 14:39:00) [17]> sniknik (29.04.2008 14:32:10) [10]
А при ТТ. никогда нельзя сказать одназначно, та или нет, это всегда рулетка.
Да Scale_Form тоже явно глобальная переменная.
sniknik (2008-04-29 14:32:00) [18]> Написала так и всегда уходит на ошибку
т.е. форма не создана (=nil)
> хотя форма высветилась.
не та значит форма.
ANB (2008-04-29 14:07:00) [19]
> npr2 (29.04.08 13:57) [8]
А форма Scale_Form живет в том же модуле ? Если нет - выкинь нафиг эту переменную из модуля потока.
А еще лучше выкини поток и работай с ком портом с помощью штатных функций.
npr2 (2008-04-29 13:57:00) [20]if Assigned(Scale_Form) then
Scale_Form.Edit1.Text:= Stroka
else
ShowMessage('Error!');
Написала так и всегда уходит на ошибку ( в потоке цикл опроса Сом порта), хотя форма высветилась. Edit1 не динамический. Почему так происходит тогда?