Forum
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.
QTConcurrent ile çözülebiliyormuş
Parallelism e göre çok daha yavaş ve eski bir yöntem .
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
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
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();
}
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.