Я начинаю понимать механизм использования потоков, но, похоже, я застрял,
Если я понял, мне нужно создать свой собственный класс, выпустить метод run()
, а затем создать поток.
проблема в том, что мой поток должен прочитать из графического интерфейса (основной поток) некоторые переменные, и, используя их, он создаст некоторые другие переменные, которые основное окно будет читать и отображать.
дело в том, что я получаю соединение Bluetooth, которое должно быть всегда активным в потоке, но графический интерфейс должен отображать значения, считанные из этого потока.
это функция, которая должна быть в отдельном потоке:
// Listen to the device for data
void gui::listen_device()
{
unsigned char buf[10];
unsigned char crcval;
fd_set readmask;
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 28000;
memset (buf, 0, 10);
int v = 0, v1 = 0, v2 = 0;
while(1)
{
int i;
FD_ZERO (&readmask);
FD_SET (sock, &readmask);
if (select (255, &readmask, NULL, NULL, &tv) > 0)
{
if (FD_ISSET (sock, &readmask))
{
int numb;
numb = 0;
numb = recv (sock, buf, 10, MSG_WAITALL);
crcval = BP_CRC8 (buf, 9);
// 8 bits
if (ui->comboBox->currentIndex() == 0)
{
if (crcval == buf[9])
{
s++;
// Print of counter
printf ("%d ->", buf[0]);
fprintf (data, "%d,", buf[0]);
for (int i = 1; i < 9; i++)
{
v = buf[i];
printf ("%d,", v);
fprintf (data, "%d,", v);
}
printf ("\n");
fprintf (data, "\n");
//fprintf(data, "s: %d, f: %d\n", s,f);
}
else
{
f++;
}
}
// 12 bits
else if (ui->comboBox->currentIndex() == 1)
{
if (numb == 14)
{
// Print of counter
printf ("%d,", buf[0]);
fprintf (data, "%d,", buf[0]);
for (i = 1; i < numb - 1; i += 3)
{
v1 = buf[i] | ((buf[i + 1] & 0x0F) << 8);
v2 = buf[i + 2];
v2 = (v2 << 4) | ((buf[i + 1] & 0xf0) >> 4);
printf ("%d,%d,", v1, v2);
fprintf (data, "%d,%d,", v1, v2);
}
printf ("\n");
fprintf (data, "\n");
}
}
}
}
}
}
и некоторые из этих читаемых здесь переменных являются глобальными, как sock, data, and the ui->combobox
.
Я хочу, чтобы buf
был доступен для главного окна.
Любой совет?
ОБНОВИТЬ:
почему это неправильно?
void QMyThread::run()
{
listen_device();
}
select
, а затемrecv(MSG_WAITALL)
. Вы звонитеselect
, потому что не хотите блокировать чтение на неопределенный срок. Но затем вы специально создаете свой вызов чтения, прося его заблокировать на неопределенный срок! - person David Schwartz   schedule 06.03.2013buf
глобальной переменной или переменной-членом. В отличие от разных процессов, все потоки в одном процессе уже совместно используют память. Однако некоторые функции графического интерфейса не будут работать из других потоков, но просто доступ к переменным должен работать нормально. - person Some programmer dude   schedule 06.03.2013read
вместоrecv
, и поэтому у меня не было флага. - person SamuelNLP   schedule 06.03.2013while(1)
, он заблокирует мой графический интерфейс, если он не находится в другом потоке. - person SamuelNLP   schedule 06.03.2013