Я хотел бы запустить мою ветку одновременно в качестве основной программы. Как мне это сделать? В настоящее время поток выполняет бесконечный цикл, но я бы хотел, чтобы он запускался одновременно с продолжением работы моей основной программы. Вот мой код.

Это моя тема:

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.

0
Learning2code 28 Май 2017 в 09:10

2 ответа

Лучший ответ

Я предполагаю, что вы знаете, что должны передать pthread_create() указатель на функцию. В C нет такой вещи, как «указатель на функцию с аргументами», это просто адрес функции. Итак, что вы делаете здесь, это просто вызываете функцию обычным способом , эта функция никогда не возвращается, поэтому 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);
1
user2371524user2371524 28 Май 2017 в 06:25

Вы сами вызываете функцию потока, а не передаете ее pthread_create в качестве указателя. Это означает, что функция будет работать вечно, и никакой поток не будет создан.

Вам нужно создать способ передачи параметров, например, структуру

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;
}

И в вашей основной функции вы определяете структуру, устанавливаете значения и передаете ее функции потока через pthread_create;

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

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

Таким образом, ваша функция потока вызывается pthread, и передаваемые ей параметры будут использоваться из потока. Конечно, всегда следите за тем, чтобы структура параметров не выходила из области видимости и не освобождалась во время работы потока.

1
Sami Kuhmonen 29 Май 2017 в 05:12