与C中的程序同时运行线程

时间:2017-05-28 06:10:39

标签: c linux pthreads

我想同时运行我的主程序作为我的主程序。我该怎么办?目前该线程正在运行一个永无止境的循环,但我希望它在我的主程序继续运行的同时运行。这是我的代码。

这是我的主题:

void *LEDReadingsTimer(char *buffer, int clientSocket) //void *arg
{
    while(timer!=0)
    {
        delay(2000);
        LEDReadings(buffer, clientSocket);
        printf("Data Sent to Android!\n");
    }
    return 0;
}

这是我的主要代码:

timer=1;
  wiringPiSetupSys () ;
  gertboardAnalogSetup (100) ;
  pthread_create(&tid, NULL, LEDReadingsTimer(buffer,clientSocket), NULL);


  //Receive and send data from and to Android
  while(1){ 
      nread = recv(clientSocket,buffer,4096,0);//recvfrom(clientSocket, buffer,1024, 0, (struct sockaddr *) &serverStorage, &addr_size);
      buffer[nread] = '\0';

      if((atof(buffer)>=0)&&(atof(buffer)<=1)){
      printf("Data Received: %s\n", buffer);  
      LEDBrightness(buffer);             
      //LEDReadings(buffer, clientSocket);

  } 

这是我的LEDReadings功能。

int LEDReadings(char *buffer, int clientSocket){
    int x1, x2 ;
    double v1, v2 ;
    double a;

    printf ("| Channel 0 | Channel 1 |\n") ;
        // Read the 2 channels:
        x1 = analogRead (100) ; //voltage
        x2 = analogRead (101) ; //current
        // Convert to a voltage:
        v1 = (double)x1 / 1023.0 * 3.3 ;
        v2 = (double)x2 / 1023.0 * 3.3 ;
        a = v2*30;
        printf ("%6.3f|%6.3f\n", v1, a) ;
        fflush (stdout) ;
        snprintf(buffer, 4096,"%6.3fsplit%6.3f\n", v1, a);
        send(clientSocket,buffer,strlen(buffer)+1,0);
        return 0;
}

一旦我的pthread运行,它就不会进入下一个while循环来执行recv功能。

2 个答案:

答案 0 :(得分:1)

您自己调用线程函数,而不是将其作为指针赋予pthread_create。这意味着该函数将永远运行,并且不会创建任何线程。

您需要创建一种传递参数的方法,例如struct

struct params
{
    char *buffer;
    int clientSocket;
}

然后将线程函数更改为将其作为参数

的函数
void *LEDReadingsTimer(void *args)
{
    struct params *pars = args;

    while(timer!=0)
    {
        delay(2000);
        LEDReadings(pars->buffer, pars->clientSocket);
        printf("Data Sent to Android!\n");
    }

    return 0;
}

在你的main函数中,你定义一个struct,设置值并通过pthread_create将它传递给线程函数;

struct params pars;
pars.buffer = buffer;
pars.clientSocket = clientSocket;

pthread_create(&tid, NULL, LEDReadingsTimer, &pars);

这样,您的线程函数由pthread调用,您传递给它的参数将可以从线程中使用。当然,总是确保参数struct不会超出范围并在线程运行时被释放。

答案 1 :(得分:1)

我假设您知道必须传递pthread_create()函数指针。在C中没有这样的东西作为带有参数&#34;的&#34;函数指针,它只是函数的地址。所以你这里只是以正常的方式调用函数,这个函数永远不会返回,所以pthread_create()永远不会执行,等待其中一个它的论点。

查看pthread_create()的原型:

   int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

这意味着您的start_routine必须接受并返回void *。所以你必须将你的功能的签名改为

void *LEDReadingsTimer(void *args);

现在,你如何传递参数?只需使用结构。在某处定义此结构:

struct LEDReadingsTimerArgs
{
    char *buffer;
    int clientSocket;
};

然后您可以将线程功能更改为:

void *LEDReadingsTimer(void *args)
{
    struct LEDReadingsTimerArgs *lrtArgs = args;
    while(timer!=0)
    {
        delay(2000);
        LEDReadings(lrtArgs->buffer, lrtArgs->clientSocket);
        printf("Data Sent to Android!\n");
    }
    return 0;
}

pthread_create的最后一个参数是用于传递参数,所以开始你的线程:

struct LEDReadingsTimerArgs lrtArgs = {buffer, clientSocket};
pthread_create(&tid, NULL, LEDReadingsTimer, &lrtArgs);