我想同时运行我的主程序作为我的主程序。我该怎么办?目前该线程正在运行一个永无止境的循环,但我希望它在我的主程序继续运行的同时运行。这是我的代码。
这是我的主题:
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 :(得分: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);