|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Thread, Handle. Обращение к форме из потока
Здравствуйте. Прошу помочь в решении следующего вопроса:
Есть процесс который при старте создает копии формы (количество зависит от кол-ва записей в блокноте (номеров)). Вместе с созданием ыормы происходит и создание отдельного потока. В потоке выполняется отправка данных на компонент VaComm и чтение с Vabuffer. Они в единичном экземпляре и находятся в Data Module. Суть проблемы: 1) Как передать специальный номер (номер записан в лейбл)если для каждой созданой формы он уникален (Каждая форма создает свой поток)? 2) Как прочитать данные из переменных потока, если они не глобальны. |
#2
|
||||
|
||||
Цитата:
Цитата:
|
#3
|
||||
|
||||
PostMessage не гарантирует доставку данных, взамен можно использовать SendMessage.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#4
|
||||
|
||||
Цитата:
А теперь глупый вопрос... Как в SendMessage передать обращение к процедуре Thread.Execute ? |
#5
|
||||
|
||||
Обращение вряд ли передашь, это сообщение для другого предназначено. Использовать CallBack?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
||||
|
||||
пользовательские данные ( __in_opt LPVOID lpParameter) или в потомке от TThread переопределить конструктор и добавить необходимы данные
Цитата:
речь шла о том, как из потока передать данные...вот их и передавать в форму с помощью SendMessage из метода Thread.Execute или как сказано выше - CallBack |
#7
|
||||
|
||||
Суть моей проблемы состоит в том что при создании формы ей в лейбл передается уникальный номер. Этот номер используется для обращения к блоку управления (с таким же номером) каждые три секунды через ком порт. Прямые обращения к форме по имени я не могу делать поскольку её имя мне неизвестно при создании (да и гемороя больше). При создании формы создается и поток который вызывается таймером каждые 3 секунды. В execute потока находится код который выполняет обмен. Т.е. мне в execute надо передавать номер блока, выполнить чтение с блока, перевести данные в читабельный вид (всё происходит в процедурах потока) и вывести на форму. Если использовать глобальные переменные то все формы показывают данные одного блока, а мне нужны разные
|
#8
|
||||
|
||||
попробуйте, во вложении костяк
|
Этот пользователь сказал Спасибо cotseec за это полезное сообщение: | ||
Darlok (07.04.2012)
|
#9
|
||||
|
||||
Цитата:
ShowMessage(Format('From Thread %n',[Mess.WParam])); (я переменную i заменил на n. Нужно было так) Ошибка следующая: format %n invalid or incompatible with argument и ругается на строку выше. |
#10
|
||||
|
||||
Код:
Caption:=(Format('From Thread %i',[Mess.WParam])); n - в формате числа с плавающей запятой. Уверены, что это нужно? Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
||||
|
||||
Цитата:
|
#12
|
||||
|
||||
Возникла проблема... М.б. что-то не правильно делаю но...:
Код:
FThread:=TWorkThread.Create(true,$FF,Handle); FThread.Priority:=tpLower; |
#13
|
||||
|
||||
передавайте это число, которое вписано в лейбле (как-то же туда его вы вписываете), поток создавайте после того, как вписали в лейбл необходимое значение
посмотрите на передаваемые типы, я для примера указал, что в поток передается тип byte, вы поставьте свой тип и что подразумевается под этим? Цитата:
|
#14
|
||||
|
||||
Цитата:
Цитата:
На несоответствие типов никаких намёков небыло |
#15
|
||||
|
||||
Ошибку выловил... Оказалось что SendMesage передавая параметры типа integer не воспринимает 0 впереди всего набора символов. (Прикол с передачей номера уже решил). Теперь возник новый вопрос, как передать 0 в начале? Дело в том что от блока данные приходят в таком типе: 0xxxxxxxxxxxxxxxx
где 0 - указатель того что блок отправил на компьютер, а ххх - байты которые нужно обработать |