İki Farklı iş Eş Zamanlı Çalışma??

Başlatan eqooo, 17 Şubat 2015, 15:26:29

eqooo

Merhaba arkadaşlar,
Kullandığım dil C/C++.  Bir proje üzerinde çalışıyorum ve işin içinden çıkamadım. Kodu çalıştırıyorum ve  kodun görevi kameradan görüntü almak ve kaydetmek. Bu işlemi standart bir şekilde yapacaktır ve internet bağlantısı sağlanır ve sağlanan bağlantıdan komut gelirse data almak için kod kaydettiği görüntü verilerini tcp bağlantısı üzerinden aktaracak. Fakat aynı zamanda da kameradan görüntü almaya devam edecektir.

Bu kısımda sıkıntı yaşamaktayım istediğim performansı elde edemedim. Önce görüntü al sonra gönder mantığıyla birşeyler oluyor ama tam istediğim gibi değil. Eş zamanlama mantığına dair neler yapabilirim?

Programlama mantığı olarak fikir verirseniz üstünde çalışıp deneyeceğim.

MrDarK

Bir timer resim alıp kaydetmekle görevlendir.
Bir timer'ıda internet bağlantısını kontrol etmek için kullan.
İki timer'danda olumlu değer alıyorsan istediğin periyodda bir resim datası gönder.
Picproje Eğitim Gönüllüleri ~ MrDarK

eqooo

@MrDarK önerin için teşekkür ederim hemen deniyorum.

yamak

#3
Hocam eğer çalıştığınız ortam PC,SBC vs. ise thread kullanabilirsiniz.

Salih

Alıntı yapılan: yamak - 17 Şubat 2015, 17:50:49
Hocam eğer çalıştığınız orta PC,SBC vs. ise thread kullanabilirsiniz.

Arkadaş haklı, timer la olmaz, thread kullanılmalıdır.
thread windows da senin istediğin işlemi yaptırıyor.
Yani aynı anda iki proses çalışabiliyor.

Gökhan BEKEN

Bilgisayarda mı çalışıyorsunuz, mcu'da mı? Eğer mcu(çift çekirdek değilse) ise thread kullanılmaz o yüzden sordum.
Özel mesaj okumuyorum, lütfen göndermeyin.

eqooo

Cevaplarınız için teşekkür ediyorum. Dünden beri uğraşıyorum . Timerla olmadı. Dediğiniz gibi threadlere baktım onunla olacak gibi. Beagleboard xM (AngstromOS) .

eqooo

Merhaba Arkadaşlar,
Dünden beri uğraşıyorum ama bir yerde takıldım. Normal seri terminalden AT komutu gönderiyorum ve normal bir şekilde cevap alıyorum.

int main(int argc,char *argv[],char *envp[]) {
	SerialPortI sport;
	sport.connect("/dev/ttyUSB0");
	int timeout=atoi(argv[1]);
	fd_set rset;
	AtCommand at(sport,rset);
	while(at.send("AT",timeout,2,"OK","ERROR")!=1);
	_port = sport.getPort();
	cout<<" _port is: "<<_port<<endl;
				int ln1=0;
				int m1 = 0 ;
				char c1;
				string s1;
				char dizi1[1024];
				while(1){
					FD_ZERO(&fs);
					FD_ZERO(&fr);
					FD_SET(STDIN_FILENO,&fr); //read
					FD_SET(_port,&fr);   // read
					if(m1) FD_SET(_port,&fs); // write
					if (select(_port+ 1, &fr, &fs, NULL, NULL) < 0)
						perror("select error : ");

					if(FD_ISSET(STDIN_FILENO,&fr)){ //read from terminal
						getline(cin,s1);s1+="\r\n";
						ln1+=s1.length();
						if(ln1>0)
							m1 = 1;
						else
							m1 = 0;
					}
					if(FD_ISSET(_port,&fr)){ // read port
						int i=0;
						data.clear();
						while(read(_port,&c1,1)>0){
						if(isprint(c1))
							if(c1!='\r' && c1!='\n' && (int)c1!=4){
								write(STDOUT_FILENO,&c1,1);
								dizi1[i]=c1;
							++i;
							}
						}
						cout<<"\n";
						string ns(dizi1,i);
					}
					if(FD_ISSET(_port,&fs)){ //write port
						unsigned int i;
						for(i=0;i<s1.length();++i)
							write(_port,&s1[i],1);
						usleep(10000);
						for(i=0;i<s1.length();++i){
							read(_port,&c1,1);
							ln1-=1;
						}
						if(ln1<1)
							m1=0;
					}
				}
	return -1;
}



Fakat ben bu while'in içindeki kod parçasını alıp Thread'in fonksiyonuna atınca işler değişiyor. İlk açıldığında thread fonksiyonu çalışıyor ve ne zaman konsoldan veri girip entera bassam seri porttan data almıyor . hatta hiç threade girmiyor sanki. ilk çalıştığında ekrana "thread" yazıyor ard arda ve 3 sayiyede bir "while" yazıyor. Ne zaman bir data girsem "thread" yazısı olmuyor sadece "while" yazısı geliyor 3 saniyede bir.


#define lln cout<<endl
fd_set fds,fds2;
int xyz;
int _port;
bool tt=false;
fd_set fs,fr;
void *function(void *thread_id)
{
			int ln=0;
			int m = 0 ;
			char c;
			string s;
			char dizi[1024];
                        cout<<"thread"<<endl;
			while(1){
				FD_ZERO(&fs);
				FD_ZERO(&fr);
				FD_SET(STDIN_FILENO,&fr); //read
				FD_SET(_port,&fr);   // read
				if(m) FD_SET(_port,&fs); // write
				if (select(_port+ 1, &fr, &fs, NULL, NULL) < 0)
					perror("select error : ");

				if(FD_ISSET(STDIN_FILENO,&fr)){ //read from terminal
					getline(cin,s);s+="\r\n";
					ln+=s.length();
					if(ln>0)
						m = 1;
					else
						m = 0;
				}
				if(FD_ISSET(_port,&fr)){ // read port
					int i=0;
					data.clear();
					while(read(_port,&c,1)>0){
					if(isprint(c))
						if(c!='\r' && c!='\n' && (int)c!=4){
							write(STDOUT_FILENO,&c,1);
							dizi[i]=c;
						++i;
						}
					}
					cout<<"\n";
					string ns(dizi,i);
				}
				if(FD_ISSET(_port,&fs)){ //write port
					unsigned int i;
					for(i=0;i<s.length();++i)
						write(_port,&s[i],1);
					usleep(10000);
					for(i=0;i<s.length();++i){
						read(_port,&c,1);
						ln-=1;
					}
					if(ln<1)
						m=0;
				}
			}
}

int main(int argc,char *argv[],char *envp[]) {
	
	pthread_t *ti;
	cout<<" : "<< createThread(ti,function)<<endl;
	while(1){
		cout<<"while"<<endl;
		sleep(3);
	}
	return -1;
}

eqooo

Herkese merhaba,
Öncelikle çalışmalarımdan öğrendiğim şeyleri paylaşayım dedim. select() fonksiyonunun thread-safe özelliği olduğundan dolayı kodumu düzgün çalışır hale getiremedim. Bunun yerine poll() fonksiyonunu kullandım ve sıkıntısız bir şekilde kullanıyorum. Thread içinde sıkıntısız çalışmaktadır.