Russian Qt Forum

Qt => Общие вопросы => Тема начата: Пантер от Сентябрь 06, 2007, 11:25



Название: Помощь по нитям
Отправлено: Пантер от Сентябрь 06, 2007, 11:25
Никак не могу разобраться с работой нитей в куте. Как, допустим, мне запихнуть функцию в поток?


Название: Re: Помощь по нитям
Отправлено: pastor от Сентябрь 06, 2007, 11:41
Весь код, который должен выполниться в потоке, помещаеться в метод run()

Код:
class YourThread : public QThread
 {
 public:
     void run();
 };

 void YourThread::run()
 {
     //your  code
 }

Подробнее читаем в асисстанте или в Бланшетте


Название: Re: Помощь по нитям
Отправлено: Пантер от Сентябрь 06, 2007, 12:01
Это я понял. Есть у меня главный класс, в нем функция, которая обращается к другим функциям, данным ЭТОГО класса. Как мне закинуть ее в Run?


Название: Re: Помощь по нитям
Отправлено: dilshodm от Сентябрь 06, 2007, 15:08
Цитировать
Это я понял. Есть у меня главный класс, в нем функция, которая обращается к другим функциям, данным ЭТОГО класса. Как мне закинуть ее в Run?

Надо просто вызвать необходимую public функцию из метода run()
Только она  (функция и, соотвественно, класс, ее содержащий) должна быть thread-safe, т.е. надо применять мютексы для исключения одновременного изменения данных.


Название: Re: Помощь по нитям
Отправлено: Tonal от Сентябрь 06, 2007, 15:26
По поводу синхронизации читать это: http://tula.bofh.ru/articles/184 (осторожно, ненормативная лексика)


Название: Re: Помощь по нитям
Отправлено: Пантер от Сентябрь 06, 2007, 17:39
По поводу синхронизации читать это: http://tula.bofh.ru/articles/184 (осторожно, ненормативная лексика)

:) Спасибо, это уже не раз изучал, хотя и не таким доступным языком. :)


Название: Re: Помощь по нитям
Отправлено: Пантер от Сентябрь 06, 2007, 17:53
Цитировать
Это я понял. Есть у меня главный класс, в нем функция, которая обращается к другим функциям, данным ЭТОГО класса. Как мне закинуть ее в Run?

Надо просто вызвать необходимую public функцию из метода run()
Только она  (функция и, соотвественно, класс, ее содержащий) должна быть thread-safe, т.е. надо применять мютексы для исключения одновременного изменения данных.

А можно немного поподробнее? Есть у меня класс:
class MainWindowImpl : public QMainWindow
{
public:
    void updateFileList(const QString qsPath)
     {
          ..............
          Добавление в QTableWidget
     }
}
Как эту функцию вызвать из треда? Ведь в данном случае в треде нужно создать экземпляр класса? Или как?


Название: Re: Помощь по нитям
Отправлено: pastor от Сентябрь 06, 2007, 18:45
Как эту функцию вызвать из треда? Ведь в данном случае в треде нужно создать экземпляр класса? Или как?

Так нельзя. Прога у тебя упадет. Из другого потока нельзя обращаться напрямую к гуёвым элементам. Общаться между твоим и гуёвым потоком можно, например, через эвенты. Читаешь данные в потоке и при помощи эвента передаещь в гуевый поток.


Название: Re: Помощь по нитям
Отправлено: Пантер от Сентябрь 06, 2007, 18:58
Спасибо всем за помощь. Буду как-нибудь раскапывать.