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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2013, 19:50   #1
de_guta
 
Регистрация: 09.09.2011
Сообщений: 3
По умолчанию Проблема с вызовом функций DLLки из 2х потоков

Доброго времени суток;
Возникла проблема которую не могу решить.
Есть ряд функций из DLL (работа с внешним usb устройством) которые вызываются из созданного потока
В определенные промежутки времени, эти же функции мне необходимо вызывать и из основного потока.
Т.е. в основном потоке необходимо переключать устройство на управление, при этом не мешая другому потоку читать данные из устройства. Я пробую просто приостанавливать созданный поток, выполнять мне необходимые действия с устройством, и возобновляю поток. Прогр. зависает во время выполнения кода основного потока между suspend и resume если между ними находится любая функция из импортируемой DLL. Если же поток не приостанавливать,
то функции отрабатывают, но передаваемые устройству данные в потоке могут быть восприняты как управляющие.

Теперь из того что вообще не понятно: Код успешно работает на моем компе, проверял, код между suspend и resume выполняется, проверял сто раз. При подключении этого же USB устройства к другому компу, этот же код зависает на вызове функции между вызовами suspend и resume


Код:
  TStThread = class(TThread)
   private
      function GetStDATA:boolean;

   protected
      procedure Execute; override;
    end;

    function FT_W32_CreateFile(pvArg1:Pointer; dwAccess:dword; dwShareMode:dword; lpSecurityAttributes:Pointer; dwCreate:dword;
 dwAttrsAndFlags:dword; hTemplate:THandle) : THandle;  stdcall; External 'FTD2XX.DLL' name 'FT_W32_CreateFile';

    function    FT_W32_EscapeCommFunction(ftHandle:THandle; dwFund:dword):boolean; stdcall; External 'FTD2XX.DLL' name 'FT_W32_EscapeCommFunction';

    function FT_W32_WriteFile(ftHandle:THandle; lpBuffer:Pointer; dwBytesToWrite:DWORD; lpdwBytesWritten:Pointer; lpOverlapped:Pointer): Boolean;
  stdcall; External 'FTD2XX.DLL' name 'FT_W32_WriteFile';

var
  StThread:TStThread;
  DevHND :THandle;
  ControlByte:Byte;
  BytesWritten_ST:Integer;
  

procedure TStThread.Execute;
var ByteSet:Byte;
begin
ByteSet:=$10;

 while not Terminated do
    begin
           FT_W32_EscapeCommFunction(DevHND,6)
           FT_W32_WriteFile(DevHND,@ByteSet,1,@BytesWritten_ST,nil)
    //  далее  чтение из устройства
    end;
end;

procedure TMain.FormShow(Sender: TObject);
begin
   DevHND:= FT_W32_CreateFile(MyUSBDevice, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FT_OPEN_BY_DESCRIPTION, 0);
   if DevHND<>Invalid_handle_value then
       StThread:=TStThread.Create(false);
end;


procedure TMain.Button1Click(Sender: TObject);
begin
         StThread.Suspend;

         FT_W32_EscapeCommFunction(DevHND,5);
         FT_W32_WriteFile(DevHND,@ControlByte,1,@BytesWritten_ST,nil);
         FT_W32_EscapeCommFunction(DevHND,6);    

          StThread.Resume;
end;








Os Win8, RAD XE2

Последний раз редактировалось Stilet; 26.11.2013 в 21:48.
de_guta вне форума Ответить с цитированием
Старый 27.11.2013, 10:59   #2
de_guta
 
Регистрация: 09.09.2011
Сообщений: 3
По умолчанию Решил вопрос

Почитал что Suspend и Resume - зло.
Решил проблему: вынес 2 функции FT_W32_EscapeCommFunction и FT_W32_WriteFile в отдельную процедуру и вызываю ее из основного и из дополнительного потоков, использование критической секции в этой процедуре гарантирует выполнение функций поочередно.

Код:
Procedure ST_Control(CByte,DTR:byte);
begin
        EnterCriticalSection(MyCritical);
      // Set or Clear DTR
        FT_W32_EscapeCommFunction(DevHND,DTR);
        
        FT_W32_WriteFile(DevHND,@CByte,1,@BytesWritten_ST,nil);
        
        LeaveCriticalSection(MyCritical);
end;
de_guta вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с вызовом функции Terikon JavaScript, Ajax 6 17.10.2013 19:11
ошибка в макросе с вызовом функций длл norvik Microsoft Office Excel 2 22.07.2012 02:33
Проблема с вызовом Юлия_utcit HTML и CSS 0 03.01.2011 23:00
Проблема с вызовом динамической DLL SkAndrew Общие вопросы Delphi 12 12.03.2010 07:59
Реализация функций синхронизации потоков. натка Помощь студентам 1 03.01.2008 15:26