![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Здравствуйте. Прошу помочь в решении следующего вопроса:
Есть процесс который при старте создает копии формы (количество зависит от кол-ва записей в блокноте (номеров)). Вместе с созданием ыормы происходит и создание отдельного потока. В потоке выполняется отправка данных на компонент VaComm и чтение с Vabuffer. Они в единичном экземпляре и находятся в Data Module. Суть проблемы: 1) Как передать специальный номер (номер записан в лейбл)если для каждой созданой формы он уникален (Каждая форма создает свой поток)? 2) Как прочитать данные из переменных потока, если они не глобальны. |
|
#2
|
||||
|
||||
|
Цитата:
Цитата:
|
|
#3
|
||||
|
||||
|
PostMessage не гарантирует доставку данных, взамен можно использовать SendMessage.
|
|
#4
|
||||
|
||||
|
Цитата:
А теперь глупый вопрос... Как в SendMessage передать обращение к процедуре Thread.Execute ? |
|
#5
|
||||
|
||||
|
Обращение вряд ли передашь, это сообщение для другого предназначено. Использовать CallBack?
|
|
#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 - в формате числа с плавающей запятой. Уверены, что это нужно? |
|
#11
|
||||
|
||||
|
Цитата:
|
|
#12
|
||||
|
||||
|
Возникла проблема... М.б. что-то не правильно делаю но...:
Код:
FThread:=TWorkThread.Create(true,$FF,Handle); FThread.Priority:=tpLower; |
|
#13
|
||||
|
||||
|
передавайте это число, которое вписано в лейбле (как-то же туда его вы вписываете), поток создавайте после того, как вписали в лейбл необходимое значение
посмотрите на передаваемые типы, я для примера указал, что в поток передается тип byte, вы поставьте свой тип и что подразумевается под этим? Цитата:
|
|
#14
|
||||
|
||||
|
Цитата:
Цитата:
На несоответствие типов никаких намёков небыло |
|
#15
|
||||
|
||||
|
Ошибку выловил... Оказалось что SendMesage передавая параметры типа integer не воспринимает 0 впереди всего набора символов. (Прикол с передачей номера уже решил). Теперь возник новый вопрос, как передать 0 в начале? Дело в том что от блока данные приходят в таком типе: 0xxxxxxxxxxxxxxxx
где 0 - указатель того что блок отправил на компьютер, а ххх - байты которые нужно обработать |