C multiThread (Aynı Anda 3 den fazla programı çalıştırma)

Başlatan Kaanx, 20 Nisan 2014, 21:36:36

Kaanx

Merhabalar C ile multithread kosturmak istiyorum. VLC + Webcam + Alsa ve FreeTUXtv gibi bunları bi C kodunda yazıp ./çalıştırProgramlar dediğimde hepsi ayrı thread olarak çalışabilir mi acaba ?

http://softpixel.com/~cwright/programming/threads/threads.c.php

#include <pthread.h>
#include <stdio.h>

/* This is our thread function.  It is like main(), but for a thread*/
void *threadFunc(void *arg)
{
	char *str;
	int i = 0;

	str=(char*)arg;

	while(i < 110 )
	{
		usleep(1);
		printf("threadFunc says: %s\n",str);
		++i;
	}

	return NULL;
}

int main(void)
{
	pthread_t pth;	// this is our thread identifier
	int i = 0;

	pthread_create(&pth,NULL,threadFunc,"foo");
	
	while(i < 100)
	{
		usleep(1);
		printf("main is running...\n");
		++i;
	}

	printf("main waiting for thread to terminate...\n");
	pthread_join(pth,NULL);

	return 0;
}


Burada
thread1 system("vlc -vvv https.....")
thread2 system("freetuxTV")
thread3("Opencv ile yazdıgım kontrol programı ./Smarttv");

*olacak şekilde kosturmak istiyorum ve bu uygulamalar hepsi birbiriyle haberleşir halde olmalı mesela Opencv cameradan verdiğim komutları vlc player algılamalı kanal değişimi yapmalı gibi
Konuyla alakalı bir diğer başlık https://forum.ubuntu-tr.net/index.php?topic=42990.0 incelemek isterseniz olay hakkında biraz bilgi sahibi olabiliriz :)

Tagli

Çalıştırmak istediklerin farklı programlar. Bu durumda iş multithread değil, multiprocess olur. Programlar arasındaki veri iletişimi ise biraz daha zorlaşır çünkü her programın kendi adres bölgesi vardır. Bunların aralarında konuşma yöntemlerine "Inter-process communication" (IPC) denir ve birkaç farklı şekilde yapılabilir. Aklıma gelenler: pipe, socket ve paylaşımlı bellek.

Genel olarak bir programın başka bir programı exec sistem çağrısı ile başlatabilmesi için önce kendini fork'laması gerekir. Çünkü exec sistem çağrısı yapıldığı anda program (daha doğrusu process) tamamen silinerek çalıştırılan programa dönüşür, kodun geriye kalanı da yalan olur. O yüzden kendini fork'layıp (klonlayıp), klonlardan birini (child process denir) feda etmesi gerekiyor.
Gökçe Tağlıoğlu

Kaanx

Hocam bu bayag detaylı olmus ben sadece yeni bir procces acmak istedim onuda böyle yaptım :)

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

pthread_t tid[2];

void* doSomeThing(void *arg)
{
    unsigned long i = 0;
    pthread_t id = pthread_self();

    if(pthread_equal(id,tid[0]))
    {
        printf("\n First thread processing\n");
	system("freetuxtv");
	
    }
    else
    {
        printf("\n Second thread processing\n");
	system("vlc -vvv https://dl.dropbox.com/s/sck6kcuy5h540ds/TV_KANALLARI.m3u?dl=1");
	//system("/home/kaan/Masaüstü/OpenCV/OpenCvC++/Eclipse/OpenCVProject/src/.SmartTV");
    }

    for(i=0; i<(0xFFFFFFFF);i++);
	

    return NULL;
}

int main(void)
{
    int i = 0;
    int err;

    while(i < 2)
    {
        err = pthread_create(&(tid[i]),NULL , &doSomeThing, NULL);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));
        else
            printf("\n Thread created successfully\n");

        i++;
    }

    sleep(5);
    return 0;
}