2016-04-19 4 views
0

Im в настоящее время экспериментирует с небольшим приложением ncurses.C/C++ ncurses freeze

Что это такое должно быть do получает сообщение через последовательный порт, это сообщение разделено на: а затем оно должно показывать разные значения в отдельных окнах. Ive использовал strtok, чтобы «разбить» его.

У меня все работает, кроме обновления текстового окна, оно обновляет одно окно правильно, и как только я обновляю следующее окно, оно замерзает. Теперь, ive попробовал много разных вещей с этим, и ему пришлось вернуться к очень грубому пути, просто чтобы просто это сделать. Пожалуйста, смотрите этот код:

while(1){ 


read (fd, in,20); 


s = strtok(in,":"); 




while (s != NULL) 
{ 

    mvwprintw(winrpm,1,1,s); 
    s = strtok(NULL, ":"); 
    mvwprintw(wintrans,1,1,s); 
} 

refresh(); 
wrefresh(winrpm); 
wrefresh(wintrans); 


//refresh(); 
} 

Everyting работает как ожидается, если я удалить второй mvwprintw, но с этим один в, она замерзает после первого обновления.

Любые идеи? Я знаю, что я должен включить весь мой код, но его 98% ncurses чертежи окон и цвета и прочее.

+0

Это бесконечный цикл. Нет никакого ожидания или чего-то еще. Вот почему он висит. – Leandros

+0

Да, я знаю его бесконечную петлю. Это очень грубо, но почему он только висит с еще одним окном для обновления? – 540

+0

О! Благодаря! Я просто добавил, если NULL перерыв, и теперь он работает. Тогда вам нужно найти лучший цикл для него. Не ожидал, что ncurses замораживают инсайты null, но это было небрежно со мной. Большое спасибо – 540

ответ

1

Вы можете попробовать это. Если первый strtok не равен NULL, токен печатается на winrpm, и в то же время будет пытаться получить еще один токен, и если он успешно напечатает токен до winrpm и wintrans.

while(1){ 

    read (fd, in,20); 

    if ((s = strtok (in, ":")) != NULL) { 
     mvwprintw (winrpm, 1, 1, s); 
     while ((s = strtok (NULL, ":")) != NULL) { 
     { 
      mvwprintw (winrpm, 1, 1, s); 
      mvwprintw (wintrans, 1, 1, s); 
     } 
    } 
    refresh(); 
    wrefresh(winrpm); 
    wrefresh(wintrans); 
}