Как сделать обертку потока Qt - PullRequest
0 голосов
/ 28 октября 2011

Я написал некоторый библиотечный код (на C), чтобы упростить создание и запрос потоков независимо от платформы.Вот пример psuedo-кода API для создания потока:

 result OS_createThread ( 
      pointer to thread handle (set after thread is created), 
      stack size,
      function to run, 
      pointer to parameters,
      priority )

В зависимости от платформы, я использую соответствующий файл c, который содержит конкретную реализацию ОС для запуска потока.Например,

result OS_createThread ( 
 // Windows implementation
 map priority to Windows priority
 // Use Win32 threading call
 CreateThread(blah blah)

Я создал порты для Win32, потоков POSIX и некоторых RTOS, которые я использовал.Теперь мне нужно сделать это для среды Qt, и я немного озадачен.Во-первых, я новичок в Qt, во-вторых, похоже, что для этого потребуется объектно-ориентированный подход с использованием класса QThread.

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

При использовании QThreads новый объект QThread долженбыть создан каждый раз, когда запрашивается новая тема?Имейте в виду, что код вызова не может иметь ничего специфичного для Qt.

Любое руководство приветствуется!

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Чтобы создать QThread, вы должны реализовать класс, унаследованный от QThread.Пример, взятый из документации QT

class MyThread : public QThread
 {
 public:
     void run();
 };

 void MyThread::run()
 {
     QTcpSocket socket;
     // connect QTcpSocket's signals somewhere meaningful
     ...
     socket.connectToHost(hostName, portNumber);
     exec();
 }

И скрытый в вашей реализации будет:

result OS_createThread ( 
      pointer to thread handle (set after thread is created), 
      stack size,
      function to run, 
      pointer to parameters,
      priority )
{
  MyThread *thread = new MyThread(size, function, parameters, prio);
  thread->start();
  return thread;
}

Таким образом, ваш метод интерфейса C будет создавать экземпляр такогокласс для каждого запрашиваемого потока.Затем этот класс должен хранить все соответствующие данные, переданные из вашей функции, в переменных-членах.Функция потока, которая должна быть выполнена, будет вызвана в методе run().Поскольку кажется, что вы выполняете только методы на языке C, я не вижу проблем с сохранением указателя на них в переменной класса (пожалуйста, исправьте меня, если я ошибаюсь - еще не пробовал;).

Однако, егона самом деле это немного сложнее, потому что кому-то придется освободить память, созданную для переменной thread.И это не легко (из интерфейса C) возможно с моим примером.Так что вы можете подумать об использовании внутреннего класса менеджера или чего-то такого, что обрабатывает созданные потоки и уничтожает их по мере необходимости.Однако для того, чтобы сделать квалифицированное заявление о том, как вы можете этого добиться, мне понадобится немного больше информации;)

0 голосов
/ 28 октября 2011

Если вызывающий код не специфичен для Qt, почему вы хотите использовать или реализовать QThread-s?

Если ваша цель - портировать QThread-s (фактически, библиотеку QCore) на вашу странную операционную систему, я сначала подробно изучу, как они реализовали ее над Pthreads (предполагая, что вы уже хорошо знаете детали потоков posix).

...