Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];

Вниз

Передать THandle в поток   Найти похожие ветки 

 
Призрак ©   (2006-06-15 04:12) [0]

Я пишу модуль для работы с COM-портом. Модуль содержит в себе Thread Object. Все переменные я сделал как свойства Thread Object"а, потому что если захочу работать сразу с двумя портами - то переменные описанные просто в модуле будут общими для двух экземпляров потоков, а так нельзя.

В конструкторе этого потока создаётся ещё один поток (с помощью BeginThread), для записи. То есть - сам Thread Object читает, а пишет вот этот созданный поток (его функция - тоже часть того Thread Object"а).

Вопрос: как передать пишущему потоку хэндл, в который писать? Я по-всякому пробовал, но всё время что-то не так :( Я бы хотел при создании передать хэндл как параметр, но как это правильно сделать?


 
Сергей М. ©   (2006-06-15 08:35) [1]

Не вижу никакой необходимости создания для этой цели двух потоков.
Обмен данными с дивайсом, подключенным к СОМ-порту, как правило синхронный ("запрос - ответ"), поэтому один-единственный поток с успехом справится с этой задачей.


 
Призрак ©   (2006-06-15 10:02) [2]

м-м... у меня так прямее получается...
там не совсем "запрос-ответ"...
главное - как передать потоку хэндл порта правильно?..


 
Сергей М. ©   (2006-06-15 10:14) [3]


> там не совсем "запрос-ответ"


Ну это не суть как важно.
Важнее то что порт в каждый момент времени используется программой либо для приема либо для передачи.


> как передать потоку хэндл порта правильно?


function MyThreadFunc(Handle: THandle): Integer;
begin
MessageBox(0, PChar(IntToStr(Integer(Handle)), "Значение переданного хэндла", mb_ok);
end;

..

NewThreadHandle := BeginThread(nil, 0, @MyThreadFunc, Pointer(MyHandle), NewThreadId);

function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
 ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
 var ThreadId: LongWord): Integer;


 
Призрак ©   (2006-06-15 10:40) [4]

Так не работает! :( Мессаджбокс выдаёт явно левое мно-о-огозначное число и ошибка записи - неверный хэндл...


 
Сергей М. ©   (2006-06-15 12:01) [5]

Все это замечательно работает, не выдумывай.

А если это не работает, значит у тебя ошибка в 17-й строке.


 
Призрак ©   (2006-06-15 12:16) [6]

MessageBox(0, PChar(inttostr(integer(portHandle))), "Right handle", MB_OK);
WriteThreadHandle:=BeginThread(nil, 0, @TPort.WriteThreadProc, @portHandle, 0, WriteThread);

function TPort.WriteThreadProc(pH: THandle): Longint;
begin
   MessageBox(0, pchar(inttostr(integer(pH))), "Received Handle", MB_OK);
   WriteFile(pH, b, 1, written, @Ovr);
   if GetLastError <> ERROR_IO_PENDING then
       MessageBox(0, PChar(SysErrorMessage(GetLastError)), "Write error", MB_OK or MB_ICONSTOP);
end;

сначала первый мессаджбокс (Right handle) выдаёт 92.
потом второй (Received handle) выдаёт 4468036.
потом третий выдаёт результат - "Неверный иденктификатор".

Меня терзают сомнения относительно того что в BeginThread мы передавали указатель на хэндл, а в функции принимаем сам хэндл, а не указатель...


 
Сергей М. ©   (2006-06-15 12:24) [7]


> Меня терзают сомнения относительно того что в BeginThread
> мы передавали указатель на хэндл, а в функции принимаем
> сам хэндл, а не указатель...


И правильно терзают !

Ты уж определись, что ты передаешь - либо адрес значения либо само значение.
ПРинципиальной разницы нет никакой, но способ передачи параметра должен соответствовать способу его приема.

В твоем случае (передача параметра по ссылке) прием параметра должен выглядеть так:

function TPort.WriteThreadProc(pH: PHandle): Longint;
begin
  MessageBox(0, pchar(inttostr(Integer(pH^))), "Received Handle", MB_OK);


 
Сергей М. ©   (2006-06-15 12:26) [8]

Да, кстати ... А с какого перепугу WriteThreadProc() у тебя объявлен и реализован как метод класса, а не как регулярная функция ?


 
Призрак ©   (2006-06-15 21:57) [9]

1) Я просто не знаю точно, позволит ли мне WinAPI использовать одну и ту же переменную из разных потоков, и вообще один и тот же хэндл из разных потоков...

2) И так я пробовал, сейчас ещё раз попробую и скажу...

3) Я же говорил - у меня будет несколько экземпляров этого потока запущено, поэтому, как я понимаю, надо всё объявлять как часть Thread Object"а... Ну, функцию можно попробовать как обычную сделать, наверное от этого ничего страшного не будет, она же всё равно при вызове BeginThread копируется, да?.. Если я пропишу её просто в модуле, а не в объекте, и потом два раза запущу этот BeginThread, то он правильно всё сделает?..

Вот, попробовал. Заменил в описании функции THandle на PHandle и добавил ^ там где используется её значение. То же самое: первый мессаджбокс выдаёт 92, а второй - -2081649835 (отрицательное даже), после чего, естественно, неверный идентификатор...

О_О  о мокрые штаны пьяных ламеров... я сделал её не частью объекта, а просто регулярной функцией, и всё заработало... спасибо ^_^ А почему нельзя было делать её частью объекта?


 
Сергей М. ©   (2006-06-16 08:36) [10]


> почему нельзя было делать её частью объекта?


Потому что метод объекта подразумевает неявную передачу в него первым параметром ссылки на объект.


 
Призрак ©   (2006-06-16 22:48) [11]

точно... дошло... спасибо 8)


 
Defunct ©   (2006-06-17 08:23) [12]

Нет предела извращениям...
Зачем два потока? читай побайтово и пиши побайтово в одном потоке... процессор все равно один.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.011 c
2-1150892358
G-UNIT
2006-06-21 16:19
2006.07.09
звуковые эффекты


15-1149869397
dimodim
2006-06-09 20:09
2006.07.09
AT2ATX


15-1150009714
TUser
2006-06-11 11:08
2006.07.09
Эта странная Малайзия ...


10-1120634549
Alkid
2005-07-06 11:22
2006.07.09
Отладка COM-объектов


15-1149942229
Victor_Mw
2006-06-10 16:23
2006.07.09
Время работы проги в Delphi - Console Application??





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский