2016-02-21 3 views
0

У меня есть функция прокрутки текста слева направо в интерфейсе NCurses, но это зависит от таймера каждые 500 мс или около того, чтобы правильно записать новый символ спереди и удалить предыдущий символ. Вот код:Асинхронный таймер внутри функции

void GekkoFyre::TuiHangouts::gui_scrollText(WINDOW *display, const char *msg, 
              const int &msgPosY) 
{ 
    size_t maxX = getmaxx(display); 
    size_t msgLen = strlen(msg); 
    short origPosY = 0; 
    short origPosX = 0; 
    getyx(display, origPosY, origPosX); // Obtain the original cursor position 

    if (msgLen > maxX) { 
     // size_t diff = (msgLen - maxX); 
     size_t i = 0; 
     for (i = maxX; i < msgLen; ++i) { 
      // Scroll the message from left to right, then vice versa, so that it fits within the 
      // designated window. 
      move(msgPosY, 0); 
      clrtoeol(); // Delete just the given line, <http://stackoverflow.com/questions/5072881/how-to-clear-a-specific-line-with-ncurses> 
      move(origPosY, origPosX); // Go back to the original cursor position 
      std::string tmp((msgLen - i), msg[(msgLen - i)]); 
      wattron(display, A_REVERSE); // Highlight selection 
      mvwaddstr(display, msgPosY, 0, tmp.c_str()); 
      std::this_thread::sleep_for(std::chrono::milliseconds(500)); 
     } 
    } 
} 

Я честно понятия не имею, работает ли это, потому что я не смог заставить его работать. Но есть ли такой таймер, как std::this_thread::sleep_for(std::chrono::milliseconds(500));, который вы можете использовать в функции, но асинхронно? Это было бы красиво! Я провел некоторое исследование и наткнулся на std :: async и std :: thread, но они зависят от внешнего вида функции.

Любая помощь будет принята с благодарностью, спасибо.

+0

Это, вероятно, не сработает, поскольку использует потоки (см. [FAQ] (http://invisible-island.net/ncurses/ncurses.faq.html#multithread)). –

ответ

1

Но есть ли таймер, как, например, std::this_thread::sleep_for(std::chrono::milliseconds(500));, который вы можете использовать в функции, но является асинхронным?

Нет, вы не можете. Что вы на самом деле поняли из термина асинхронное поведение. Для захвата прошедшего таймер события вам понадобится точка соединения в другом месте вашего кода.

+0

Что вы подразумеваете под _joining point_? Извинения, но я действительно борюсь с номенклатурой программирования. Я никогда не учился формально, но я полностью самоучка, прилагая все усилия, чтобы учиться на этом пути, и мне очень сложно не знать много номенклатуры, которую другие «просто получают». –

+0

@Phobos Ну _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ –

+0

Спасибо, πάντα ῥεῖ :) –

Смежные вопросы