Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
PVGDRK |
24.9.2010, 15:35
Сообщение
#1
|
|
Студент ![]() Группа: Участник Сообщений: 49 Регистрация: 27.4.2010 Пользователь №: 1662 Спасибо сказали: 0 раз(а) Репутация: 0
|
Имеется программа, которая выполняет следующие действия,
динамически выделяется оперативная память для хранения очень большого массива данных далее эти данные по сети посылаются в другой компутер,,, При передаче данных по сети вся система начинает тормозить. программу невозможно закрыть до тех пор пока не закончится эта передача .,,, В общем посоветовали мне передачу данных организовать не в основном потоке... поскольку опыта программирования у меня почти нет - приходиться учиться по ходу дела буду всем признательна за помощь поможет ли избавиться от "тормозов" организация многопоточности - может есть какие то решения по-проще? Далее вопрос про сам принцип организации этой многопоточности в книге пишут,что нужно создать класс QThread и перезаписать в нем виртуальный метод run(), в котором должен быть реализован код, который будет исполняться в потоке Суть вроде ясна, а вот как переменные и соединения сигнал-слот из базового класса перенести в этот метод run()? Может я не совсем корректно что то написала.т.к. не разбираюсь в данном вопросе.... сама программа передачи данных была написана другим человеком на С , мне лишь нужно было сделать для нее графический интерфейс в QT и кое чего добавть... помогите пожалуйста разобраться в данном вопросе |
|
|
|
|
Алексей1153 |
24.9.2010, 18:34
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(PVGDRK @ 24.9.2010, 18:35) Link поможет ли избавиться от "тормозов" организация многопоточности поможет в том смысле, что основной поток не будет простаивать на всё время, пока идёт передача данных. То есть, оба потока (основной и передающий) будут чуток медленнее работать, чем если бы это был один процесс, но зато приложение сможет реагировать на сообщения от системы и пользователя программы. Если запутал, то так: когда в основном потоке запущена долго выполняющаяся функция, на время останавливается обработка сообщений от системы - включая обработку клавиатуру и перерисовку контекста. Если же отправку переложить на второй поток, то "тормозить" (а вернее, быть неинтерактивным) будет он. А основной поток останется интерактивным и может в случае необходимости управлять вторым потоком |
|
|
|
|
PVGDRK |
24.9.2010, 19:09
Сообщение
#3
|
|
Студент ![]() Группа: Участник Сообщений: 49 Регистрация: 27.4.2010 Пользователь №: 1662 Спасибо сказали: 0 раз(а) Репутация: 0
|
Спасибо за разъяснения. Я примерно так и предполагала.
А вот как быть с самой реализацией второго потока? Почитала про дружественные функции - может это поможет объединить объекты двух классов, или делать дружественные классы? Или я ошибаюсь? |
|
|
|
|
Алексей1153 |
24.9.2010, 19:21
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(PVGDRK @ 24.9.2010, 22:09) Link А вот как быть с самой реализацией второго потока так у тебя же в посте приведён таки пример реализации - там только осталось наполнить процедуру потока (run) |
|
|
|
|
PVGDRK |
24.9.2010, 20:12
Сообщение
#5
|
|
Студент ![]() Группа: Участник Сообщений: 49 Регистрация: 27.4.2010 Пользователь №: 1662 Спасибо сказали: 0 раз(а) Репутация: 0
|
Это мне понятно, а как в этом классе QThread использовать мой массив, к которому я обращаюсь в базовом классе через указатель? Имеет ли значение то,что массив хранится в оперативной памяти и используется еще и в других функциях базового класса? Как сделать, чтобы остальные переменные были "видны" в классе QThread с теми же значениями, которые они принимают в базовом классе?
Прошу прощения за глупые вопросы, мне еще никогда не приходилось работать с двумя классами |
|
|
|
|
Алексей1153 |
24.9.2010, 20:19
Сообщение
#6
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
PVGDRK, заведи в классе потока приватную член -переменную указатель на основной класс приложения (или всего, что потребуется). Заведи также публичную функцию для настройки указателей. И, главное, не забывай о синхронизации доступа к данным при многопоточности
|
|
|
|
|
PVGDRK |
24.9.2010, 20:28
Сообщение
#7
|
|
Студент ![]() Группа: Участник Сообщений: 49 Регистрация: 27.4.2010 Пользователь №: 1662 Спасибо сказали: 0 раз(а) Репутация: 0
|
Ох, спасибо
Как то до этого больше с железяками возилась |
|
|
|
|
Алексей1153 |
24.9.2010, 20:38
Сообщение
#8
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
PVGDRK, железки - обычно однопоточные, поэтому в них про синхронизацию не задумываешься )
про переменные - будет нечто вроде Цитата(PVGDRK @ 24.9.2010, 23:28) Link А вот про синхронизацию в ООП впервые слышу синхронизация относится не к ООП, а к тому факту, что два потока могут, условно говоря, одновременно пытаться работать с ресурсом. Под ресурсом тут понимается хоть что - массив, файл, устройство. Если сам ресурс не поддерживает синхронизацию внутри своих методов, то эту синхронизацию надо делать самим Сообщение отредактировал Алексей1153 - 24.9.2010, 20:39 |
|
|
|
|
PVGDRK |
24.9.2010, 23:29
Сообщение
#9
|
|
Студент ![]() Группа: Участник Сообщений: 49 Регистрация: 27.4.2010 Пользователь №: 1662 Спасибо сказали: 0 раз(а) Репутация: 0
|
Спасибо большое за разъяснения. В понедельник буду разбираться дальше
|
|
|
|
|
Алексей1153 |
24.9.2010, 23:41
Сообщение
#10
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
а в выходные не будешь ? )
|
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 31.12.2025, 6:16 |