crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Помогите разобраться c передачей данных по сети!, создание двух потоков
PVGDRK
  опции профиля:
сообщение 24.9.2010, 15:35
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 27.4.2010
Пользователь №: 1662

Спасибо сказали: 0 раз(а)




Репутация:   0  


Имеется программа, которая выполняет следующие действия,
динамически выделяется оперативная память для хранения очень большого массива данных далее эти данные по сети посылаются в другой компутер,,, При передаче данных по сети вся система начинает тормозить. программу невозможно закрыть до тех пор пока не закончится эта передача .,,,
В общем посоветовали мне передачу данных организовать не в основном потоке...
поскольку опыта программирования у меня почти нет - приходиться учиться по ходу дела буду всем признательна за помощь
поможет ли избавиться от "тормозов" организация многопоточности - может есть какие то решения по-проще?
Далее вопрос про сам принцип организации этой многопоточности
в книге пишут,что нужно создать класс QThread и перезаписать в нем виртуальный метод run(), в котором должен быть реализован код, который будет исполняться в потоке
class MyThread:public QThread
{
   public:
   void run()
    {
      код исполняемый в потоке
     }
}

Суть вроде ясна, а вот как переменные и соединения сигнал-слот из базового класса перенести в этот метод run()?
Может я не совсем корректно что то написала.т.к. не разбираюсь в данном вопросе.... сама программа передачи данных была написана другим человеком на С , мне лишь нужно было сделать для нее графический интерфейс в QT и кое чего добавть...
помогите пожалуйста разобраться в данном вопросе
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.9.2010, 18:34
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2879
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(PVGDRK @ 24.9.2010, 18:35) *
поможет ли избавиться от "тормозов" организация многопоточности

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

Если запутал, то так: когда в основном потоке запущена долго выполняющаяся функция, на время останавливается обработка сообщений от системы - включая обработку клавиатуру и перерисовку контекста. Если же отправку переложить на второй поток, то "тормозить" (а вернее, быть неинтерактивным) будет он. А основной поток останется интерактивным и может в случае необходимости управлять вторым потоком
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PVGDRK
  опции профиля:
сообщение 24.9.2010, 19:09
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 27.4.2010
Пользователь №: 1662

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо за разъяснения. Я примерно так и предполагала.
А вот как быть с самой реализацией второго потока?
Почитала про дружественные функции - может это поможет объединить объекты двух классов, или делать дружественные классы? Или я ошибаюсь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.9.2010, 19:21
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2879
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(PVGDRK @ 24.9.2010, 22:09) *
А вот как быть с самой реализацией второго потока

так у тебя же в посте приведён таки пример реализации - там только осталось наполнить процедуру потока (run) :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PVGDRK
  опции профиля:
сообщение 24.9.2010, 20:12
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 27.4.2010
Пользователь №: 1662

Спасибо сказали: 0 раз(а)




Репутация:   0  


Это мне понятно, а как в этом классе QThread использовать мой массив, к которому я обращаюсь в базовом классе через указатель? Имеет ли значение то,что массив хранится в оперативной памяти и используется еще и в других функциях базового класса? Как сделать, чтобы остальные переменные были "видны" в классе QThread с теми же значениями, которые они принимают в базовом классе?
Прошу прощения за глупые вопросы, мне еще никогда не приходилось работать с двумя классами :unsure:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.9.2010, 20:19
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2879
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


PVGDRK, заведи в классе потока приватную член -переменную указатель на основной класс приложения (или всего, что потребуется). Заведи также публичную функцию для настройки указателей. И, главное, не забывай о синхронизации доступа к данным при многопоточности :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PVGDRK
  опции профиля:
сообщение 24.9.2010, 20:28
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 27.4.2010
Пользователь №: 1662

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ох, спасибо :) Про переменные почитаю - спасибо ,что сказали, как они называются. А вот про синхронизацию в ООП впервые слышу :blink:
Как то до этого больше с железяками возилась :unsure:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 24.9.2010, 20:38
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2879
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


PVGDRK, железки - обычно однопоточные, поэтому в них про синхронизацию не задумываешься )

про переменные - будет нечто вроде

//это некий класс, где храниться массив и так далее
class CMyClass
{

};


class MyThread:public QThread
{
   CMyClass* m_pDataKeeper;
  

   public:
   MyThread(CMyClass* m_pDataKeeper=0):m_pDataKeeper(m_pDataKeeper)
   {
   }

//тут ещё, может быть, методы
//....

   void run()
    {
        if(m_pDataKeeper)
        {
              m_pDataKeeper->....;
         }
      код исполняемый в потоке
     }
}


Цитата(PVGDRK @ 24.9.2010, 23:28) *
А вот про синхронизацию в ООП впервые слышу

синхронизация относится не к ООП, а к тому факту, что два потока могут, условно говоря, одновременно пытаться работать с ресурсом. Под ресурсом тут понимается хоть что - массив, файл, устройство. Если сам ресурс не поддерживает синхронизацию внутри своих методов, то эту синхронизацию надо делать самим

Сообщение отредактировал Алексей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


фрилансер
******

Группа: Участник
Сообщений: 2879
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


а в выходные не будешь ? )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.6.2019, 10:15