На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> потоки в dll delphi
    Есть DLL, в ней создаю поток, который выполняет основные действия. Понадобилось параллельно выполнять еще действия, создал второй поток, но при запуске двух потоков одновременно, то и 1 перестает работать. Если не запускать второй поток, то первый выполняется хорошо. Для примера создал второй поток, который ничего не делает, но все равно не работает.

    ExpandedWrap disabled
      TMyThread = class(TThread)
        protected
          procedure Execute; override;
        end;
       
      TMyThread2 = class(TThread)
        protected
          procedure Execute; override;
        end;
       
      var
        MyThread: TMyThread;
        MyThread2: TMyThread2;
       
      ...
       
      procedure TMyThread.Execute;
      var
        msg: TMSG;
        FComponentUSB: TComponentUSB;
      begin
        FComponentUSB := TComponentUSB.CreatE(nil);
        try
          PeekMessage(msg, 0, 0, 0, PM_NOREMOVE);
          while not Terminated and GetMessage(msg, 0, 0, 0) do
          begin
            TranslateMessage(msg);
            DispatchMessage(msg);
          end;
        finally
          FComponentUSB.Free;
        end;
      end;
       
      procedure TMyThread2.Execute;
      begin
        while true do
        begin
          sleep(1000);
        end;
      end;
       
      begin
        MyThread := TMyThread.Create(False);
        MyThread2 := TMyThread2.Create(False);
       
      end.

    Может я чего-то не понимаю, но по идее, потоки не должны блочить друг друга или основной поток. Можете помочь разобраться ?
      Да, представленный кусок должен работать.
      Поменяй во 2м потоке while True на while not Terminated для фэншуйности.
      А "перестает работать" - это что? Не запускается Execute, не выполняет обработку сообщений? Детали нужны
        немног предисловие
        поток 1 - мониторит подключение усб
        поток 2 - пустой (для тестов, а вообще должен мониторить подключение nas через кмд)
        итак, путем тестов понял, что, когда запускаю сразу 2 потока именно первый коннект усб не видит, а последующие видит нормально, а если запускать только поток 1, то первый и последующие коннекты флэхи видит без проблем. Более подробно stackoverflow Может вы мне сможете помочь разобраться ?
          1) Надо проверять результат USBRegister, а то мало ли что.
          2) Надо отследить, где конкретно затыкается: правильно ли иниц-лась выборка сообщений? Сообщение вообще не приходит в GetMessage? Сообщение не передается в WndProc? Сообщение отбраковывается в WMDeviceChange?
          Сообщение отредактировано: Fr0sT -
            Цитата Fr0sT @
            1) Надо проверять результат USBRegister, а то мало ли что.

            сделал, чтоб выводило результат USBRegister, заинжектил длл, вставил влэху, и только потом высветился результат USBRegister. Если ожидать появления результата, а только потом вставлять флэшку, то все норм (логично), но немного странно было, что все последующие разы быстро выводился результат USBRegister (1-2 сек, хотя при первом тесте заняло порядка 5-6). Видимо, когда запускаю 2 потока для USBRegister требуется больше времени, что странно, ведь запускаю 2 не связных потока.

            Спасибо большое, что не прошли мимо и помогли, если что - я отпишусь
            Сообщение отредактировано: xerasy -
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0493 ]   [ 17 queries used ]   [ Generated: 24.04.24, 02:30 GMT ]