Fischhirn
15-11-2010, 23:47
Hallo alle zusammen,
ich habe mich extra hier neu angemeldet, da ich trotz google Probleme in der Threadprogrammierung habe.
Genauer genommen liegt mein Problem aber eher in der Nutzung der Zeiger!
Ich habe ein Programm zur Ansteuerung des AVR-IO-NET-Moduls geschrieben und wenn ich alle Variablen global gestalte und dem Thread selber den nötigen Socket "einverleibe", funktioniert auch alles.
Aber naja.. globale Variablen sind unschön :rolleyes:
Ich habe nun das funktionierende so umgewurschtelt, wie es meiner Meinung nach vorerst richtig ist, nur das eben die entscheidenen Stellen fehlen.
Also wie kann ich im folgenden Quellcode den char Text aus Thread "abfrage" dem Thread "befehle" übergeben?
Und wie kann ich dem Thread "befehle" den Socket sock aus der main übergeben, um dem Modul die outputbefehle zu senden?
#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <termios.h>
using namespace std;
char buffersend[1024];
char outport11[] = "setport 1.1\r\n";
char outport10[] = "setport 1.0\r\n";
char outport21[] = "setport 2.1\r\n";
char outport20[] = "setport 2.0\r\n";
char outport31[] = "setport 3.1\r\n";
char outport30[] = "setport 3.0\r\n";
char outport41[] = "setport 4.1\r\n";
char outport40[] = "setport 4.0\r\n";
char outport51[] = "setport 5.1\r\n";
char outport50[] = "setport 5.0\r\n";
char outport61[] = "setport 6.1\r\n";
char outport60[] = "setport 6.0\r\n";
char outport71[] = "setport 7.1\r\n";
char outport70[] = "setport 7.0\r\n";
char outport81[] = "setport 8.1\r\n";
char outport80[] = "setport 8.0\r\n";
int kbhit(void);
int kbhit(void)
{
struct termios term, oterm;
int fd = 0;
int c = 0;
tcgetattr(fd, &oterm);
memcpy(&term, &oterm, sizeof(term));
term.c_lflag = term.c_lflag & (!ICANON);
term.c_cc[VMIN] = 0;
term.c_cc[VTIME] = 1;
tcsetattr(fd, TCSANOW, &term);
c = getchar();
tcsetattr(fd, TCSANOW, &oterm);
if (c != -1)
ungetc(c, stdin);
return ((c != -1) ? 1 : 0);
}
int getch();
int getch()
{
static int ch = -1, fd = 0;
struct termios neu, alt;
fd = fileno(stdin);
tcgetattr(fd, &alt);
neu = alt;
neu.c_lflag &= ~(ICANON|ECHO);
tcsetattr(fd, TCSANOW, &neu);
ch = getchar();
tcsetattr(fd, TCSANOW, &alt);
return ch;
}
void *abfrage()
{
cout << "Thread abfrage gestartet!\n";
char text = 'x';
while(text != 'q')
{
if(kbhit())
{
text = getchar();
}
else
{
text = 'x'
}
}
return 0;
}
void *befehle()
{
cout << "Thread befehle gestartet!\n";
while(text != 'q')
{
if (text != 'x')
{
if(text == '1')
{
send(sock, outport11, strlen(outport11), 0);
}
if(text == '2')
{
send(sock, outport21, strlen(outport21), 0);
}
if(text == '3')
{
send(sock, outport31, strlen(outport31), 0);
}
if(text == '4')
{
send(sock, outport41, strlen(outport41), 0);
}
if(text == '5')
{
send(sock, outport51, strlen(outport51), 0);
}
if(text == '6')
{
send(sock, outport61, strlen(outport61), 0);
}
if(text == '7')
{
send(sock, outport71, strlen(outport71), 0);
}
if(text == '8')
{
send(sock, outport81, strlen(outport81), 0);
}
}
else
{
send(sock, outport10, strlen(outport10), 0);
usleep(3000);
send(sock, outport20, strlen(outport20), 0);
usleep(3000);
send(sock, outport30, strlen(outport30), 0);
usleep(3000);
send(sock, outport40, strlen(outport40), 0);
usleep(3000);
send(sock, outport50, strlen(outport50), 0);
usleep(3000);
send(sock, outport60, strlen(outport60), 0);
usleep(3000);
send(sock, outport70, strlen(outport70), 0);
usleep(3000);
send(sock, outport80, strlen(outport80), 0);
}
}
return 0;
}
int main()
{
sockaddr_in myaddr;
int sock = socket (AF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
cout << "Fehler beim Erzeugen des Sockets\n";
}
cout <<"Socket erzeugt!\n";
bzero(&myaddr, sizeof(myaddr));
myaddr.sin_family = AF_INET;
inet_pton(AF_INET, "192.168.178.101", &myaddr.sin_addr);
myaddr.sin_port = htons(50290);
if(connect(sock, (struct sockaddr *)&myaddr, sizeof(myaddr))<0)
{
cout << "Fehler beim Verbinden!\n";
}
else
{
cout << "Mit AVR-IO-NET verbunden!\n";
}
pthread_t p1,p2;
pthread_create (&p1, NULL, abfrage, NULL);
pthread_create (&p2, NULL, befehle, NULL);
pthread_join (p1, NULL);
pthread_join (p2, NULL);
cout << "Programm Ende \n";
}
Und falls es noch hilft, hier die Fehlermeldung die logischerweise noch kommt:
test.c: In function ‘void* abfrage()’:
test.c:91: error: expected ‘;’ before ‘}’ token
test.c: In function ‘void* befehle()’:
test.c:99: error: ‘text’ was not declared in this scope
test.c:104: error: ‘sock’ was not declared in this scope
test.c:108: error: ‘sock’ was not declared in this scope
test.c:112: error: ‘sock’ was not declared in this scope
test.c:116: error: ‘sock’ was not declared in this scope
test.c:120: error: ‘sock’ was not declared in this scope
test.c:124: error: ‘sock’ was not declared in this scope
test.c:128: error: ‘sock’ was not declared in this scope
test.c:132: error: ‘sock’ was not declared in this scope
test.c:137: error: ‘sock’ was not declared in this scope
test.c: In function ‘int main()’:
test.c:180: error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’
test.c:180: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
test.c:181: error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’
test.c:181: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
Ich schreibe alles unter Linux (Ubuntu) und benutze bis jetzt den g++ compiler.
Naja da haperts echt bei mir und ich hoffe ihr könnt mir helfen :)
ich habe mich extra hier neu angemeldet, da ich trotz google Probleme in der Threadprogrammierung habe.
Genauer genommen liegt mein Problem aber eher in der Nutzung der Zeiger!
Ich habe ein Programm zur Ansteuerung des AVR-IO-NET-Moduls geschrieben und wenn ich alle Variablen global gestalte und dem Thread selber den nötigen Socket "einverleibe", funktioniert auch alles.
Aber naja.. globale Variablen sind unschön :rolleyes:
Ich habe nun das funktionierende so umgewurschtelt, wie es meiner Meinung nach vorerst richtig ist, nur das eben die entscheidenen Stellen fehlen.
Also wie kann ich im folgenden Quellcode den char Text aus Thread "abfrage" dem Thread "befehle" übergeben?
Und wie kann ich dem Thread "befehle" den Socket sock aus der main übergeben, um dem Modul die outputbefehle zu senden?
#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <termios.h>
using namespace std;
char buffersend[1024];
char outport11[] = "setport 1.1\r\n";
char outport10[] = "setport 1.0\r\n";
char outport21[] = "setport 2.1\r\n";
char outport20[] = "setport 2.0\r\n";
char outport31[] = "setport 3.1\r\n";
char outport30[] = "setport 3.0\r\n";
char outport41[] = "setport 4.1\r\n";
char outport40[] = "setport 4.0\r\n";
char outport51[] = "setport 5.1\r\n";
char outport50[] = "setport 5.0\r\n";
char outport61[] = "setport 6.1\r\n";
char outport60[] = "setport 6.0\r\n";
char outport71[] = "setport 7.1\r\n";
char outport70[] = "setport 7.0\r\n";
char outport81[] = "setport 8.1\r\n";
char outport80[] = "setport 8.0\r\n";
int kbhit(void);
int kbhit(void)
{
struct termios term, oterm;
int fd = 0;
int c = 0;
tcgetattr(fd, &oterm);
memcpy(&term, &oterm, sizeof(term));
term.c_lflag = term.c_lflag & (!ICANON);
term.c_cc[VMIN] = 0;
term.c_cc[VTIME] = 1;
tcsetattr(fd, TCSANOW, &term);
c = getchar();
tcsetattr(fd, TCSANOW, &oterm);
if (c != -1)
ungetc(c, stdin);
return ((c != -1) ? 1 : 0);
}
int getch();
int getch()
{
static int ch = -1, fd = 0;
struct termios neu, alt;
fd = fileno(stdin);
tcgetattr(fd, &alt);
neu = alt;
neu.c_lflag &= ~(ICANON|ECHO);
tcsetattr(fd, TCSANOW, &neu);
ch = getchar();
tcsetattr(fd, TCSANOW, &alt);
return ch;
}
void *abfrage()
{
cout << "Thread abfrage gestartet!\n";
char text = 'x';
while(text != 'q')
{
if(kbhit())
{
text = getchar();
}
else
{
text = 'x'
}
}
return 0;
}
void *befehle()
{
cout << "Thread befehle gestartet!\n";
while(text != 'q')
{
if (text != 'x')
{
if(text == '1')
{
send(sock, outport11, strlen(outport11), 0);
}
if(text == '2')
{
send(sock, outport21, strlen(outport21), 0);
}
if(text == '3')
{
send(sock, outport31, strlen(outport31), 0);
}
if(text == '4')
{
send(sock, outport41, strlen(outport41), 0);
}
if(text == '5')
{
send(sock, outport51, strlen(outport51), 0);
}
if(text == '6')
{
send(sock, outport61, strlen(outport61), 0);
}
if(text == '7')
{
send(sock, outport71, strlen(outport71), 0);
}
if(text == '8')
{
send(sock, outport81, strlen(outport81), 0);
}
}
else
{
send(sock, outport10, strlen(outport10), 0);
usleep(3000);
send(sock, outport20, strlen(outport20), 0);
usleep(3000);
send(sock, outport30, strlen(outport30), 0);
usleep(3000);
send(sock, outport40, strlen(outport40), 0);
usleep(3000);
send(sock, outport50, strlen(outport50), 0);
usleep(3000);
send(sock, outport60, strlen(outport60), 0);
usleep(3000);
send(sock, outport70, strlen(outport70), 0);
usleep(3000);
send(sock, outport80, strlen(outport80), 0);
}
}
return 0;
}
int main()
{
sockaddr_in myaddr;
int sock = socket (AF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
cout << "Fehler beim Erzeugen des Sockets\n";
}
cout <<"Socket erzeugt!\n";
bzero(&myaddr, sizeof(myaddr));
myaddr.sin_family = AF_INET;
inet_pton(AF_INET, "192.168.178.101", &myaddr.sin_addr);
myaddr.sin_port = htons(50290);
if(connect(sock, (struct sockaddr *)&myaddr, sizeof(myaddr))<0)
{
cout << "Fehler beim Verbinden!\n";
}
else
{
cout << "Mit AVR-IO-NET verbunden!\n";
}
pthread_t p1,p2;
pthread_create (&p1, NULL, abfrage, NULL);
pthread_create (&p2, NULL, befehle, NULL);
pthread_join (p1, NULL);
pthread_join (p2, NULL);
cout << "Programm Ende \n";
}
Und falls es noch hilft, hier die Fehlermeldung die logischerweise noch kommt:
test.c: In function ‘void* abfrage()’:
test.c:91: error: expected ‘;’ before ‘}’ token
test.c: In function ‘void* befehle()’:
test.c:99: error: ‘text’ was not declared in this scope
test.c:104: error: ‘sock’ was not declared in this scope
test.c:108: error: ‘sock’ was not declared in this scope
test.c:112: error: ‘sock’ was not declared in this scope
test.c:116: error: ‘sock’ was not declared in this scope
test.c:120: error: ‘sock’ was not declared in this scope
test.c:124: error: ‘sock’ was not declared in this scope
test.c:128: error: ‘sock’ was not declared in this scope
test.c:132: error: ‘sock’ was not declared in this scope
test.c:137: error: ‘sock’ was not declared in this scope
test.c: In function ‘int main()’:
test.c:180: error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’
test.c:180: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
test.c:181: error: invalid conversion from ‘void* (*)()’ to ‘void* (*)(void*)’
test.c:181: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
Ich schreibe alles unter Linux (Ubuntu) und benutze bis jetzt den g++ compiler.
Naja da haperts echt bei mir und ich hoffe ihr könnt mir helfen :)