Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2007, 12:30   #11
CyberMerlin
Пользователь
 
Аватар для CyberMerlin
 
Регистрация: 29.07.2007
Сообщений: 10
По умолчанию

Function(@S);
таким макаром передается только указатель на s
если S не глобальная то фнкция не получит данные по завержению вызываемой функции
единственный способ самому выделить память (GetMem) куда запихнуть эту строку и передать спокойненько указатель
тем более что при вызове функций и процедур лучше всего в операнда (параметрах) передавать указатели на данные, а не сами данные - для оптимайза и ускорения работы - Марко Кэнту кажется
у меня случай именно с мультипоточностью, да еще и критическими секциями

а бесконечный цикл мне просто необходим - точнее их два
один постоянно опрашивает девайс
второй формирует запросы-пакеты и координирует повторными отправками, в случае пакетЛосса (патери пакета)
CyberMerlin вне форума Ответить с цитированием
Старый 15.08.2007, 12:49   #12
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Цитата:
Сообщение от CyberMerlin Посмотреть сообщение
Function(@S);
таким макаром передается только указатель на s
если S не глобальная то фнкция не получит данные по завержению вызываемой функции
единственный способ самому выделить память (GetMem) куда запихнуть эту строку и передать спокойненько указатель
Цитата:
Сообщение от CyberMerlin Посмотреть сообщение
тем более что при вызове функций и процедур лучше всего в операнда (параметрах) передавать указатели на данные, а не сами данные - для оптимайза и ускорения работы - Марко Кэнту кажется
Мне показалось или ты разговариваешь сам с собой? =) Я об этом и говорю ))
Цитата:
Сообщение от CyberMerlin Посмотреть сообщение
у меня случай именно с мультипоточностью, да еще и критическими секциями
а бесконечный цикл мне просто необходим - точнее их два
один постоянно опрашивает девайс
второй формирует запросы-пакеты и координирует повторными отправками, в случае пакетЛосса (патери пакета)
Зачем ПОСТОЯННО опрашивать девайс???? Выложи АЛГОРИТМ, по которому у тебя все работает.
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 15.08.2007, 13:11   #13
CyberMerlin
Пользователь
 
Аватар для CyberMerlin
 
Регистрация: 29.07.2007
Сообщений: 10
По умолчанию

Цитата:
//--------------------------------------------------------------- home --------------
// ñîáñòâåííî ïîòîê-ñêàíåð
//
procedure COMPort_wait;
var
TMask :cardinal;
P ointer; // ìåñòíàÿ îáðàáîòêà ïîëó÷åííîãî ÏÎÐÒÎÌ
begin
st :='';
while 1=1 do begin
If not WaitCommEvent(hCOM, TMask,@Ovr) then
If (GetLastError = Error_IO_Pending)and(WaitForSingleO bject(Ovr.hEvent, InfInite)=Wait_Object_0) then
if GetOverlappedResult(hCOM,Ovr,xb,tru e) then ResetEvent(Ovr.hEvent);
ClearCommError(hCOM,xn,@StatCOM); // ïîëó÷àåì ñîñòîÿíèå COM â StatCOM
If TMask = EV_RxChar then begin
xn :=StatCOM.cbInQue; // ðåàëüíîå êîë-âî áàéò â áóôåðå
GetMem(p ,SizeOf(TBuf_read));
FillChar(TBuf_read(p^).buf_b,Length (TBuf_read(p^).buf_b),#0);
IF ReadFile(hCOM,TBuf_read(p^).buf_b,x n,TBuf_read(p^).sizeBuf,@Ovr) then BEGIN
// îòñûë ìåñàãè ãë ôîðìå ×ÒÅÍÈÅ áóôåðà COM ïîðòà
If TBuf_read(p^).sizeBuf <> 0 then
SetThreadPriority(CreateTHread(nil, 0,@Rx_COM,p,0,id),THREAD_PRIORITY_a bove_normal)
ELSE FreeMem(p,SizeOf(TBuf_read));
END ELSE FreeMem(p,SizeOf(TBuf_read));
xn:=0;
end; //If TMask
end; // while bb
end;
//-------------------------------------------------------------------------- end ----
Цитата:
//--------------------------------------------------------------- home --------------
// получаем пакеты с порта
// param - TBuf_read - пакет полученный с порта
procedure Rx_COM(Param ointer){(Param :Pbuf_read)};
var // получаем пакеты с порта
ii :cardinal;
str_time :string;
pointer; p_time :PChar;
begin
EnterCriticalSection(cs);
try
State.f_OnLine :=true; // связь есть
T_new :=Time; // фиксируем время прихода байта
//While TxPackContr.Nt = 1 do SwitchToThread;
//If TxPackContr.Nt =1 then SuspendThread(Buffer_Tx_Port);
//TxPackContr.Nt :=10;

str_time :='';
For ii:= 1 to TBuf_read(Param^).sizeBuf do str_time :=str_time + chr(Tbuf_read(Param^).buf_b[ii]);
If not(State.b_Connected) then begin st:=''; str_time :=''; end;
это код который используетсо
CyberMerlin вне форума Ответить с цитированием
Старый 15.08.2007, 13:34   #14
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Может стоит поставить хук на систему, вместо того, чтобы постояноо мучать порт? И к тому же: первый поток создает второй??? И, как я понимаю, они создаются посредством WinAPI...
По мне нет ничего лучше собственноручного создания потока. В этом случае ты сможешь провести более глубокий дебаг и более точную отстройку взаимодействия потоков.
Плюс: Первый поток не дожидаясь забивает выделенную под указатель p память, а второй моет не успеть его использовать. Отсюда и может все пойти наперекосяк.
С какой ошибкой у тебя падает прога?
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 15.08.2007, 13:40   #15
CyberMerlin
Пользователь
 
Аватар для CyberMerlin
 
Регистрация: 29.07.2007
Сообщений: 10
По умолчанию

Цитата:
По мне нет ничего лучше собственноручного создания потока.
сам и создаю потоки и именно API
прога не вываливаетсо
просто поток №1 (отправляющий в порт данные и контролирующий доставку) сообщает что недоставлен пакет

Цитата:
Плюс: Первый поток не дожидаясь забивает выделенную под указатель p память
не забивает... там условие стоит когда это происходит
CyberMerlin вне форума Ответить с цитированием
Старый 15.08.2007, 13:42   #16
CyberMerlin
Пользователь
 
Аватар для CyberMerlin
 
Регистрация: 29.07.2007
Сообщений: 10
По умолчанию

и как это смелать?
"я про хук"
CyberMerlin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработчики добавления и удаления в дерево (TreeView) kayman Компоненты Delphi 10 08.03.2010 11:17
Перетасчить кучу файлов Nez Общие вопросы Delphi 4 20.03.2007 06:56