Russian Qt Forum
Ноябрь 22, 2024, 22:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Процесс замерзает при работе интерфейса  (Прочитано 23022 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #30 : Ноябрь 14, 2014, 22:33 »

Гурман, посмотрите на QThreadPool, он вам больше подайдет.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #31 : Ноябрь 14, 2014, 22:38 »

Гурман, посмотрите на QThreadPool, он вам больше подайдет.

спс, но есть сомнения, что это поможет - проблема в реализации QThread, а QThreadPool скорее всего опирается на QThread

да и приложение перепахивать уже не с руки
Записан

2^7-1 == 127, задумайтесь...
vulko
Гость
« Ответ #32 : Ноябрь 14, 2014, 22:43 »

Проблема с разными нитями запускаемыми одним и тем же QThread.

а?! ... а?! что?! где?! ... это взрыв мозга)))

Поскольку после запуска, завершения и снова запуска нити разные

нужно почаще общаться с капитаном очевидность!)))
после того как поток завершается, он как бы умирает. так что это так и должно быть.
я потому и предлагал вариант потока с while(running)


поток с мутексом без мутекса существовать не может

очередной взрыв мозга)))


поэтому переносить мутекс в run() никак нельзя, ибо этот run может выполнить поток, в котором нет и не нужны никакие мутексы, смотря какой плагин к этому потоку подключен

в разных случаях, в зависимости от конфигурации, один и тот QThread может обслуживать разные плагины - в одних есть необходимость синхронизации, в других нет - теперь понятно?

мне понятно только то, что твой интеллект почему то не позволяет иметь мьютекс, но не лочить его, если не нужно...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #33 : Ноябрь 14, 2014, 22:44 »

спс, но есть сомнения, что это поможет - проблема в реализации QThread, а QThreadPool скорее всего опирается на QThread
Ну это не проблема QThread, он делает все согласно документации: при вызове start создаёт новый поток, в котором выполняет метод run. При завершении метода run завершается и поток.
Каждый вызов start будет порождать новый поток.
Пул же сразу запускает несколько потоков, которые ждут работу QRunnable и как только она появляется выполняют её. После выполнения работы потоки не завершаются, а ждут новую работу.
« Последнее редактирование: Ноябрь 14, 2014, 22:46 от Old » Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #34 : Ноябрь 14, 2014, 23:26 »

спс, но есть сомнения, что это поможет - проблема в реализации QThread, а QThreadPool скорее всего опирается на QThread
Ну это не проблема QThread, он делает все согласно документации: при вызове start создаёт новый поток, в котором выполняет метод run. При завершении метода run завершается и поток.
Каждый вызов start будет порождать новый поток.
Пул же сразу запускает несколько потоков, которые ждут работу QRunnable и как только она появляется выполняют её. После выполнения работы потоки не завершаются, а ждут новую работу.

Фишка в том, что не известно заранее, сколько потоков надо порождать. То есть, не известно, сколько плагинов их потребуют. Хотя, может быть, в этом есть рациональное зерно. Но придется тогда расширить функциональность плагинов, они должны сообщать, что будут использовать потоки.
Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #35 : Ноябрь 14, 2014, 23:27 »

Гурман у вас проблема - не разлоченный мутекс была.
Эта проблема в плохом коде.

Вашу логику вы пояснить не можете. Какая там архитектура хитрая. Почему вам бы тупо не создавать  классы и пихать их тупо в qthread?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #36 : Ноябрь 14, 2014, 23:37 »

Гурман у вас проблема - не разлоченный мутекс была.
Эта проблема в плохом коде.

Вашу логику вы пояснить не можете. Какая там архитектура хитрая. Почему вам бы тупо не создавать  классы и пихать их тупо в qthread?


Я уже пояснил логику. Тупо пихать - не годится. Не известно заранее, что пихать. Приложение всё состоит из плагинов. Их количество и состав могут быть каждый раз разными.

Мутекс сейчас разлочен, всё пока вроде работает как надо. Проблема была в том, что в документации QThread не указано, что каждый последовательный запуск создает новую нить, с новым ID, а не использует предыдущую. Если бы это было указано, я бы изначально иначе построил приложение.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #37 : Ноябрь 15, 2014, 09:42 »

Если бы это было указано, я бы изначально иначе построил приложение.
Как же не указано? Улыбающийся
В описании метода start говорится, что будет запущена новая нить и в ней выполниться run. В описании метода run говорится, что когда он завершится - нить разрушиться.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #38 : Ноябрь 15, 2014, 10:15 »

они должны сообщать, что будут использовать потоки.
И ещё не очень понятно, для чего такое разделение?
Нужна плагину одна или несколько ниток, ну пусть он их и запускает.
Записан
Bepec
Гость
« Ответ #39 : Ноябрь 15, 2014, 11:42 »

Даже есть не так, то тупо создаёте 4 потока по умолчанию и в них пихаете классы плагинов. Нужно больше - создаёте больше. Нужно удалить плагин - даёте сигнал на удаление КЛАССУ, класс уничтожается, а поток остаётся.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #40 : Ноябрь 15, 2014, 11:51 »

даёте сигнал на удаление КЛАССУ, класс уничтожается, а поток остаётся.
Верес, скажите, вы видите разницу между классами и объектами?
Записан
Bepec
Гость
« Ответ #41 : Ноябрь 15, 2014, 14:34 »

Знаю и вижу. И я имею в виду именно то, о чем пишу Улыбающийся

А вы видите разницу между объектом и объектом класса?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #42 : Ноябрь 15, 2014, 15:53 »

Знаю и вижу.
А почему путаете их почти в каждой теме?

И я имею в виду именно то, о чем пишу Улыбающийся
Это как раз не вызывает сомнений. Улыбающийся

...даёте сигнал на удаление КЛАССУ, класс уничтожается...
Записан
Bepec
Гость
« Ответ #43 : Ноябрь 15, 2014, 16:19 »

Да именно так ) ибо объектов класса может быть неизвестное количество, согласно количеству плагинов.
Потому я и написал классу, хотя можно перефразировать и написать - отдать сигнал об уничтожении всем имеющимся объектам класса Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #44 : Ноябрь 15, 2014, 18:20 »

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


Нифига!

Цитировать
Begins execution of the thread by calling run(), which should be reimplemented in a QThread subclass to contain your code. The operating system will schedule the thread according to the priority parameter. If the thread is already running, this function does nothing.

The effect of the priority parameter is dependent on the operating system's scheduling policy. In particular, the priority will be ignored on systems that do not support thread priorities (such as on Linux, see http://linux.die.net/man/2/sched_setscheduler for more details).

See also run() and terminate().

Look up this member in the source code.

Begins execution == начинает выполнение, это подразумевает, что нить создана.

Цитировать

The starting point for the thread. After calling start(), the newly created thread calls this function. The default implementation simply calls exec().

You can reimplemented this function to do other useful work. Returning from this method will end the execution of the thread.

See also start() and wait().

Look up this member in the source code.

Ни слова про разрушение нити.
« Последнее редактирование: Ноябрь 15, 2014, 18:21 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.21 секунд. Запросов: 23.