+ Reply to Thread
Results 1 to 4 of 4

Thread: IDA PRO 6.8 Проблема с многопоточностью в плагине

  1. #1

    Default IDA PRO 6.8 Проблема с многопоточностью в плагине

    Всем привет!

    Пишу плагин для IDA и возникла проблема с созданием потоков. Например данный код, если его выполнить как IDA Python скрипт вызывает полное зависание. Знаю, что IDA это однопоточное приложение, но обычно предостережения насчёт потоков касаются только работы с базой данных (нет никаких средств синхронизации на её изменение).
    Но в данном случае с БД работа не ведётся, зависает на th.join(), видимо происходит взаимная блокировка. Кто нибудь знает в чём может быть проблема?

    Code:
    import time
    import threading
    
    def ff1():
        time.sleep(3)
        print "END ff1()"
    
    def foo():
        th = threading.Thread(target=ff1)
        th.start()
        th.join()
        print "End foo()"
    
    foo()
    Конкретная задача стоит такая - коннектится из плагина к серверу в одном потоке. Во втором потоке - блокировать ГУИ и вывести формочку - "проверяется соединение", после проверки соединения убить формочку и продолжить выполнение.

  2. #2
    Darwin's Avatar

    Default Re: IDA PRO 6.8 Проблема с многопоточностью в плагине

    Убери th.join() и будет работать.
    Счастлив кто отдал, а не взял. (с) Inception

  3. #3

    Default Re: IDA PRO 6.8 Проблема с многопоточностью в плагине

    Quote Originally Posted by Darwin View Post
    Убери th.join() и будет работать.
    Ну в конкретной задаче такой подход невозможен - первый поток должен дождаться завершения второго. Вопрос был в том, что является причиной такого поведения и какие в принципе существуют ограничения на работу с потоками в IDA.

    Насчёт данного примера появилось предположение. Скорее всего возникает взаимоблокировка из-за того что print обращается к GUI, а GUI работает в главном потоке и завис на ожидании функции ff1. Вот такой код будет работать нормально.

    Code:
    import time
    import threading
    
    def ff1():
        time.sleep(3)
        def my_print():
            print("End ff1()!")
        execute_sync(my_print, MFF_NOWAIT)
    
    def foo():
        th = threading.Thread(target=ff1)
        th.start()
        th.join()
        print "End foo()"
    
    foo()

  4. #4
    Darwin's Avatar

    Default Re: IDA PRO 6.8 Проблема с многопоточностью в плагине

    Насчёт данного примера появилось предположение. Скорее всего возникает взаимоблокировка из-за того что print обращается к GUI, а GUI работает в главном потоке и завис на ожидании функции ff1.
    Видимо так, истина где-то рядом.
    Счастлив кто отдал, а не взял. (с) Inception

+ Reply to Thread

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:22
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org