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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: многопоточность  (Прочитано 16290 раз)
StatuS74
Гость
« : Июнь 28, 2011, 13:08 »

вопрос в следующем. Иследовав форум там и не нашел ответ на интересующий меня вопрос.
у меня есть программа в ней есть 12 кнопок которые надо разбить на потоке что бы одновременно могли выполнятся все 12 операций (по количеству кнопок).суть в том что мне надо это сделать без классов ибо ризона нет создавать на каждые 4 строчки по классу которые выполняются всего  1 раз. подскажите.в ассистенте читал тоже не получил толком ответа.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Июнь 28, 2011, 13:15 »

QtConcurrent::Run()
« Последнее редактирование: Июнь 28, 2011, 13:19 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
StatuS74
Гость
« Ответ #2 : Июнь 28, 2011, 13:28 »

а приме можеш привести ?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Июнь 28, 2011, 13:35 »

http://doc.crossplatform.ru/qt/4.6.x/qtconcurrentrun.html
Записан
StatuS74
Гость
« Ответ #4 : Июнь 28, 2011, 14:16 »

а какие параметры у QtConcurrent::Run() и куда её вставлять ?
как бы понятно что там функции. а если у меня цикл  типо
for (int i=1;i<3000;i++)
{
int a = a + i;
}
(этот пример на угад, там год посложнее =)) как быть в таком случии и мне на 12 кнопок такое надо сделать =) но без класса
« Последнее редактирование: Июнь 28, 2011, 14:21 от StatuS74 » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #5 : Июнь 28, 2011, 14:24 »

а какие параметры у QtConcurrent::Run() и куда её вставлять ?
Функция, которая будет выполняться, её параметры.
Всё есть по приведённой ссылке:
1) запуск просто функции,
2) запуск функции с параметрами,
3) запуск функции и получение результата по окончании,
4) запуск функции объекта.

Записан
StatuS74
Гость
« Ответ #6 : Июнь 28, 2011, 14:28 »

а как указать в данном примере ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Июнь 28, 2011, 14:32 »

facepalm

Ну, научись же искать
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
StatuS74
Гость
« Ответ #8 : Июнь 28, 2011, 14:34 »

это не совсем то что мне нужно.... искал и то что надо не нашол. точнее нашол не понял как юзать это
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #9 : Июнь 28, 2011, 14:36 »

как бы понятно что там функции. а если у меня цикл  типо

Код
C++ (Qt)
int myMegaSum( int n )
{
   for (int i=1;i<n;i++)
   {
       int a = a + i;
   }
}
...
int n = 3000;
QFuture<int> future = QtConcurrent::run( myMegaSum, n );
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #10 : Июнь 29, 2011, 14:26 »

1) Эта функция член класса? Если нет, то откуда он вам this возьмёт?
2) GUI нельзя попрождать не в главном потоке - всё равно ж это будет следующий вопрос.
Записан
StatuS74
Гость
« Ответ #11 : Июль 04, 2011, 12:31 »

проблема в следующем.. вызываю  эту функцию в одном потоке все равботает.. а как только вызываю в 2-х и более спустя секунд 30 всё валится... функция вызывается примерно 1 раз в секунду..

Код:
//+++++++функция обработки данных и получения с датчика

QString ReadWrite (QString serial,QString nms,QString nameFile,FT_HANDLE ftHandle1)
{
             FT_STATUS ftStatus1;
             DWORD BytesWritten1;
             //DWORD sizeMsg;
             QString TxBuffer1;
            QString lrc;
           // int msg;
            nms=QString::number( nms.toInt()+1);
            TxBuffer1="#TPO,TO:";
            TxBuffer1.append(serial);
            TxBuffer1.append(QString(",FROM:")).append( QString("000001,")).append("PAS:1111,NMS:");
            TxBuffer1.append(nms);
            TxBuffer1.append(",GET_DATA:DBG_DATA,LRC:");
            lrc="00";
            QString TxBuffer1NEW = TxBuffer1;
            TxBuffer1.append(lrc).append(",#TPE");
            QString a;
            a = TxBuffer1;
            QByteArray buffer1 = TxBuffer1.toAscii();
            char * p;
            p = buffer1.data();
           quint8 cSummator;
           int lrC =buffer1.length();

           for (int k=5;k<=(lrC-5);k++)
           {
               cSummator = cSummator+p[k];
           }
           //подсчет лрц
           int cFirst,cSecond;
           cFirst=cSummator/16;
           cSecond = cSummator % 16;
           if (cFirst>9)
           {cFirst=cFirst+55;} else cFirst=cFirst+48;
           if(cSecond>9) {cSecond=cSecond+55;} else cSecond=cSecond+48;
           lrc = QString(cFirst);
           lrc.append(cSecond);
         //  cSummator = lrc.toUInt()- 0xFF+1;
           //lrc = cSummator;
           TxBuffer1NEW.append(lrc).append(",#TPE");
            QByteArray TBuffer1= TxBuffer1NEW.toAscii();
             DWORD sizeMsg;
             int dlinaComand;
             dlinaComand =TxBuffer1.length();
             sizeMsg = TxBuffer1.length();




// отправка команды



             ftStatus1 = FT_Write(ftHandle1,
                                 TBuffer1.data(),
                                 sizeMsg,
                                 &BytesWritten1);


            if (ftStatus1 == FT_OK)
            {//если строчка прошла успешно
             //progres=progres+1;


            }
            else
            {                        QMessageBox::warning(0,"ОШИБКА",
                                     "ошибка при обмене сообщениями с датчиком топлива \n"
                                     "перезапустите программу и повторите попытку",
                                     QMessageBox::Ok,QMessageBox::Ok);


            }



//чтение ответa с прибора

                  DWORD BytesReceived;
                  DWORD RxBytes = 100;
                  char RxBuffer[255]= "0";
                 //  FT_SetTimeouts(ftHandle1,250,250);
                  ftStatus1 = FT_Read(ftHandle1,RxBuffer,RxBytes,&BytesReceived);
                 QString sbufRead;
                 int sum=0;
                 sum= sum+ BytesReceived;
                 sbufRead = QString(RxBuffer);
                 ftStatus1 = FT_Read(ftHandle1,RxBuffer,RxBytes,&BytesReceived);
                 sum= sum+ BytesReceived;
                 sbufRead.append(QString(RxBuffer));
                 QString otvet;

                 QFile fl(nameFile);
                 fl.open(QIODevice::Append | QIODevice::Text );
                 QTextStream out(&fl);
                 out << nms;
                 out <<  endl;
                 fl.close();

                 for(int cm = dlinaComand;cm <= sbufRead.length();cm++)
                 {   if (sbufRead[cm]=='#'&& sbufRead[cm+1]=='T' && sbufRead[cm+2]=='P' && sbufRead[cm+3] == 'E' )
                         {
                                 otvet = otvet.append(sbufRead[cm]);
                                 otvet = otvet.append(sbufRead[cm+1]);
                                 otvet = otvet.append(sbufRead[cm+2]);
                                 otvet = otvet.append(sbufRead[cm+3]);
                                 break;
                         }
                 otvet = otvet.append(sbufRead[cm]);
                 }

          int error=0;
          int dlinaOtvet=0;
          dlinaOtvet = otvet.length();
          if (ftStatus1 == FT_OK)
                 {
                         if (dlinaOtvet+dlinaComand ==sum )
                                 {


                                       // запись ответов датчика
                                            QString  sPokazateli;
                                            for(int datc1=1; datc1<dlinaOtvet;datc1++)
                                                   {
                                                    if (otvet[datc1]=='L'&& otvet[datc1+1]=='U' && otvet[datc1+2]=='E' && otvet[datc1+3]==':')
                                                         {
                                                          datc1 = datc1+4;
                                                          while ( otvet[datc1]!=',' && otvet[datc1+1]!='L' && otvet[datc1+2]!='R' && otvet[datc1+3]!='C' )
                                                          {
                                                 if ((otvet[datc1]!=';') )
                                                 {
                                                    sPokazateli.append(otvet[datc1]);
                                                     datc1++;
                                                     if (otvet[datc1] ==',')
                                                  {
                                                         QFile d1(nameFile);
                                                         d1.open(QIODevice::Append | QIODevice::Text );
                                                         QTextStream out(&d1);


                                                         out << sPokazateli;
                                                         out <<   endl;
                                                           d1.close();
                                                          sPokazateli.clear();
                                                         // break;
                                                      }}

                                                    else
                                                          {
                                                           QFile d1(nameFile);
                                                           d1.open(QIODevice::Append | QIODevice::Text );
                                                           QTextStream out(&d1);
                                                           out << sPokazateli;
                                                           out <<   endl;
                                                           d1.close();
                                                           sPokazateli.clear();
                                                           datc1++;
                                                           }
                                                           }
                                                }
                                                 }


                          }


else
     { error++;
       if (error <=3)
        {
         QMessageBox::warning(0,"ОШИБКА",
           "тест провален 3 подрят ошибки обмена с датчиком \n"
           "перезапустите программу и повторите попытку",
            QMessageBox::Ok,QMessageBox::Ok);
               }
   }
     }
      return nms;
      }


« Последнее редактирование: Июль 04, 2011, 13:23 от StatuS74 » Записан
BRE
Гость
« Ответ #12 : Июль 04, 2011, 13:35 »

Код
C++ (Qt)
           QByteArray buffer1 = TxBuffer1.toAscii();
           char * p;
           p = buffer1.data();
          quint8 cSummator; // Сумматор не инициализирован!
          int lrC =buffer1.length();
 
          for (int k=5;k<=(lrC-5);k++) // почему условие меньгше или равно? Нужно только меньше!
// что это за констранта 5? Почему 5, а не 7?
          {
              cSummator = cSummator+p[k]; // для чего использовать указатель p? Вместо p[k] можно просто buffer1[k].
          }
 

Дальше пока не смотрел... 
Записан
StatuS74
Гость
« Ответ #13 : Июль 04, 2011, 13:40 »

отвечу кратко. так надо..-5 потому что лрц это контрольная сумма при обмене с датчиком а 5 символов последнии в сумму не входят...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #14 : Июль 04, 2011, 13:42 »

тут у тебя не входят первые 5 и последние 5 символов
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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