Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.04.2012, 23:23
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию Thread, Handle. Обращение к форме из потока

Здравствуйте. Прошу помочь в решении следующего вопроса:
Есть процесс который при старте создает копии формы (количество зависит от кол-ва записей в блокноте (номеров)). Вместе с созданием ыормы происходит и создание отдельного потока. В потоке выполняется отправка данных на компонент VaComm и чтение с Vabuffer. Они в единичном экземпляре и находятся в Data Module. Суть проблемы:
1) Как передать специальный номер (номер записан в лейбл)если для каждой созданой формы он уникален (Каждая форма создает свой поток)?
2) Как прочитать данные из переменных потока, если они не глобальны.
Ответить с цитированием
  #2  
Старый 06.04.2012, 23:29
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Цитата:
1) Как передать специальный номер (номер записан в лейбл)если для каждой созданой формы он уникален (Каждая форма создает свой поток)?
в конструкторе потока (Create), если TThread или как пользовательские данные (если WinAPI)
Цитата:
2) Как прочитать данные из переменных потока, если они не глобальны.
как пример: по необходимости отправлять в форму сообщение (PostMessage) и в LParam или WParam данные (или указатель на данные)
Ответить с цитированием
  #3  
Старый 06.04.2012, 23:41
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

PostMessage не гарантирует доставку данных, взамен можно использовать SendMessage.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #4  
Старый 06.04.2012, 23:54
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от cotseec
как пользовательские данные (если WinAPI)
как пример: по необходимости отправлять в форму сообщение (PostMessage) и в LParam или WParam данные (или указатель на данные)
По-поводу пользовательских данных, можно подробнее пожалуйста?
А теперь глупый вопрос... Как в SendMessage передать обращение к процедуре Thread.Execute ?
Ответить с цитированием
  #5  
Старый 06.04.2012, 23:59
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Обращение вряд ли передашь, это сообщение для другого предназначено. Использовать CallBack?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 07.04.2012, 00:00
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

пользовательские данные ( __in_opt LPVOID lpParameter) или в потомке от TThread переопределить конструктор и добавить необходимы данные
Цитата:
Как в SendMessage передать обращение к процедуре Thread.Execute ?
просто ради интереса Зачем?
речь шла о том, как из потока передать данные...вот их и передавать в форму с помощью SendMessage из метода Thread.Execute или как сказано выше - CallBack
Ответить с цитированием
  #7  
Старый 07.04.2012, 00:05
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Суть моей проблемы состоит в том что при создании формы ей в лейбл передается уникальный номер. Этот номер используется для обращения к блоку управления (с таким же номером) каждые три секунды через ком порт. Прямые обращения к форме по имени я не могу делать поскольку её имя мне неизвестно при создании (да и гемороя больше). При создании формы создается и поток который вызывается таймером каждые 3 секунды. В execute потока находится код который выполняет обмен. Т.е. мне в execute надо передавать номер блока, выполнить чтение с блока, перевести данные в читабельный вид (всё происходит в процедурах потока) и вывести на форму. Если использовать глобальные переменные то все формы показывают данные одного блока, а мне нужны разные
Ответить с цитированием
  #8  
Старый 07.04.2012, 00:36
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

попробуйте, во вложении костяк
Вложения
Тип файла: zip Example.zip (852 байт, 30 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо cotseec за это полезное сообщение:
Darlok (07.04.2012)
  #9  
Старый 07.04.2012, 02:32
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от cotseec
попробуйте, во вложении костяк
Попробовал. Даже не знаю, как Вам выразить мою огромную благодарность за помощь! Спасибо, человеческое спасибо Пример был интерпретирован под мои нужды и почти доделан. Единственная проблема так это ошибка при обращении к:
ShowMessage(Format('From Thread %n',[Mess.WParam]));
(я переменную i заменил на n. Нужно было так)
Ошибка следующая:
format %n invalid or incompatible with argument и ругается на строку выше.
Ответить с цитированием
  #10  
Старый 07.04.2012, 03:04
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Код:
  Caption:=(Format('From Thread %i',[Mess.WParam]));
i - означает вывести в формате целого числа.
n - в формате числа с плавающей запятой.
Уверены, что это нужно?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 07.04.2012, 03:07
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Код:
  Caption:=(Format('From Thread %i',[Mess.WParam]));
i - означает вывести в формате целого числа.
n - в формате числа с плавающей запятой.
Уверены, что это нужно?
Я не знал что это константовые символы.. Кстати эту процедуру я решил отложить и сделал другой обход. В общем всё заработало! Завтра уже доделаю вывод данных с блока и окончательно скажу как и что
Ответить с цитированием
  #12  
Старый 07.04.2012, 23:49
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Возникла проблема... М.б. что-то не правильно делаю но...:
Код:
FThread:=TWorkThread.Create(true,$FF,Handle);
FThread.Priority:=tpLower;
При создании потока мы в Thread_Data передаем число 255 в hex ($FF). А мне надо передавать число которое находится в лейбле(само число туда вписывается при создании формы). Просто передать цифры не работает. В Thread_Data передается 0. В чём может быть проблема?
Ответить с цитированием
  #13  
Старый 08.04.2012, 00:03
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

передавайте это число, которое вписано в лейбле (как-то же туда его вы вписываете), поток создавайте после того, как вписали в лейбл необходимое значение
посмотрите на передаваемые типы, я для примера указал, что в поток передается тип byte, вы поставьте свой тип
и что подразумевается под этим?
Цитата:
Просто передать цифры не работает. В Thread_Data передается 0.
может как раз вы передаете integer, который обрезается до byte, хотя с другой стороны компилятор варнинг вставил бы на несоответствие типов
Ответить с цитированием
  #14  
Старый 08.04.2012, 00:12
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от cotseec
передавайте это число, которое вписано в лейбле (как-то же туда его вы вписываете), поток создавайте после того, как вписали в лейбл необходимое значение
После присвоения номера в лейбл, передается этот же номер в переменную и только после всех этих действий происходит создание потока.
Цитата:
Сообщение от cotseec
посмотрите на передаваемые типы, я для примера указал, что в поток передается тип byte, вы поставьте свой тип
Я это сразу же исправил, на integer.

На несоответствие типов никаких намёков небыло
Ответить с цитированием
  #15  
Старый 08.04.2012, 01:02
Аватар для Darlok
Darlok Darlok вне форума
Прохожий
 
Регистрация: 27.03.2012
Сообщения: 20
Репутация: 10
По умолчанию

Ошибку выловил... Оказалось что SendMesage передавая параметры типа integer не воспринимает 0 впереди всего набора символов. (Прикол с передачей номера уже решил). Теперь возник новый вопрос, как передать 0 в начале? Дело в том что от блока данные приходят в таком типе: 0xxxxxxxxxxxxxxxx
где 0 - указатель того что блок отправил на компьютер, а ххх - байты которые нужно обработать
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter