Forum

Bildirimler
Hepsini Temizle

MultiThread

8 Yazılar
4 Üyeler
0 Reactions
795 Görüntüleme
(@muratguler)
Gönderiler: 313
Honorable Member
Konu başlatıcı
 

Merhaba

Dialog.cpp sınıfımda

host= ui->txtHost->text();
port = quint32(ui->txtPort->text().toInt());
p_Host = &host;
p_port= &port;
tBaglanti = new ThreadBaglanti(&host,&port);
tSure= new ThreadSure();
tBaglanti->start();
tSure->start();
connect(tSure,SIGNAL(sureDegisti(int)),this,SLOT(sureDegistir(int)));

böyle bir kod var.

ThreadBaglanti.cpp sınıfımda ise
ThreadBaglanti::ThreadBaglanti(QString *host, int *port) : QThread()
{
tb_host=host;
tb_port=port;
tcpsocket = new QTcpSocket(this);
connect(this,SIGNAL(sgn_baglan()),this,SLOT(slt_baglan()));
}

void ThreadBaglanti::run()
{
while(true)
{
sleep(4);
emit sgn_baglan();
}

}

void ThreadBaglanti::slt_baglan()
{
tcpsocket->connectToHost(QHostAddress("127.0.0.1"),90);
bool baglantiKontrol= tcpsocket->waitForConnected(3000);

if(false != baglantiKontrol)
{
qDebug()<<"Bağlandı";
// *baglantiDurumu= false;
}
else
{
qDebug()<<"Bağlanılmadı";
// *baglantiDurumu= true;
}
}
böyle bir kod var

süre sınıfımda ( ThreadSure.cpp) ise
ThreadSure::ThreadSure() : QThread()
{

}

void ThreadSure::run()
{
for(int i=0;true; i++)
{
sleep(1);
emit sureDegisti(i);
}
}

böyle bir kod var.

Sorum şu: ben threadleri Dialog.cpp sınıfımda çalıştırıyorum. Threadler ayr yerlerde ayrı başlatılmasına rağmen süre ilerlerken
tcpsocket->connectToHost(QHostAddress("127.0.0.1"),90);
bool baglantiKontrol= tcpsocket->waitForConnected(3000);
kodunda bağlantı için 3 saniye beklediğinden dolayı program donuyor. 3 saniye geçtikten sonra süreyi ekrana yazıyor. Ben bunların eş zamanlı
olarak nasıl çalışmasını sağlayabilirim ? Donma olayı olmadan.

 
Gönderildi : 28/11/2017 15:02

(@muratguler)
Gönderiler: 313
Honorable Member
Konu başlatıcı
 

QTConcurrent ile çözülebiliyormuş

 

 
Gönderildi : 28/11/2017 16:27

(@birolaydugan)
Gönderiler: 867
Prominent Member
 

Parallelism e göre çok daha yavaş ve eski bir yöntem .

 
Gönderildi : 29/11/2017 02:46

(@muratguler)
Gönderiler: 313
Honorable Member
Konu başlatıcı
 

Parallelism e göre çok daha yavaş ve eski bir yöntem .

 

Hangisi ilk başta yazan kodlar mı yoksa QTconcurrent mi ? 

Nasıl yapılacağını da biliyorsanız yol gösterebilir misiniz ? 

Teşekkürler

 
Gönderildi : 29/11/2017 12:14

(@muratguler)
Gönderiler: 313
Honorable Member
Konu başlatıcı
 

MultiThreadde run metodunun içerisine yazınca metotları hepsi paralel çalışabiliyor. Fakat run metodunun içerisinden sinyal verip çalıştırdığımızda çalışan threadi sıraya alıyor. Bu yüzden paralel çalışması için metotları run metoddu içerisinde çalıştırmak lazım

 
Gönderildi : 29/11/2017 13:37

(@birolaydugan)
Gönderiler: 867
Prominent Member

(@volkanalkilic)
Gönderiler: 137
Estimable Member
 

Qt ile sınırlı kalmayın, sonuçta C++ ortamında kodluyorsunuz. Hazırladığım örneği inceleyin;

#include "stdafx.h"
#include <string>
#include <iostream>
#include <thread>

using namespace std;

// Yeni iş parçacığında yürütmek istediğimiz fonksiyon.
void görev1(string msg)
{

for (size_t i = 0; i < 5000; i++)
{
cout << "görev1: " << msg;
}

}

int main()
{
// Yeni thread oluşturur ve çalıştırır. Uygulamayı durdurmaz.
thread t1(görev1, "Selam");
thread t2(görev1, "Selam");
thread t3(görev1, "Selam");

// Ana iş parçacığının yeni iş parçacığının yürütülmesini beklemesini sağlar.

t1.join();
t2.join();
t3.join();
}

 
Gönderildi : 30/11/2017 01:22

(@enisciftci)
Gönderiler: 22
Eminent Member
 

Merhaba,

 

eşzamanlılık konusu için bende Volkan bey gibi Qt ile sınırlı kalmamanızı söylmek istiyorum. Yanılmıyorsam Qt, VC++ Runtime 2017 kullanmakta. Bu da demek oluyor ki Visual Studio ile de kodlama yapabilirsiniz. Bunu önermemin sebebi de yine Birol beyin önerdiği Parallelism'dir. C#'ta bu bahsettiğinizi rahatlıkla yapabilirsiniz (Parallelism). C++ ile de bu mümkün ancak tamamen eş zamanlı yapabilmeniz için Intel size TBB (Threading Buildin Blocks) sunar. Ve C++ ile Parallelism'i bu şekilde kullanabilirsiniz.

 

Buradan Intel TBB ile genel ve detay bilgilere ulaşabilirsiniz.

Buradaki org uzantılı sitede daha da detayları mevcuttur.

 

Saygılarımla

There is always something you miss.

 
Gönderildi : 17/12/2017 18:08

Paylaş: