Простой пример многопоточности в C ++ [закрыто]

Я вижу, что таймауты используются для этого много, но в контексте события вы не можете посмотреть на координаты, например:

function areXYInside(e){  
        var w=e.target.offsetWidth;
        var h=e.target.offsetHeight;
        var x=e.offsetX;
        var y=e.offsetY;
        return !(x<0 || x>=w || y<0 || y>=h);
}

В зависимости от контекста вам может потребоваться (this == e.target) перед вызовом areXYInside (e).

fyi- Я рассматриваю этот подход внутри обработчика dragLeave, чтобы подтвердить, что событие dragLeave не было вызванный входом в дочерний элемент. Если вы каким-то образом не проверяете, что вы все еще находитесь внутри родительского элемента, вы можете ошибочно принять меры, которые предназначены только для тех случаев, когда вы действительно оставляете родителя.

EDIT: это хорошая идея, но не работают достаточно последовательно. Возможно, с небольшими ухищрениями.

390
задан Mark Rotteveel 6 December 2018 в 15:51
поделиться

2 ответа

Ну, технически любой такой объект завершит то, чтобы быть созданным по библиотеке потока C-стиля, потому что C++ только что определил запас std::thread модель в C++ 0x, который был просто закреплен и еще не был реализован. Проблема является несколько системной, технически существующая модель памяти C++ не достаточно строга для обеспечения четко определенной семантики для всего из, 'происходит перед' случаи. Hans Boehm написал работу по теме некоторое время назад и способствовал выработке C++ 0x стандарт по теме.

http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html

, Который сказал, существует несколько межплатформенных библиотек C++ потока, которые работают просто великолепно на практике. Стандартные блоки потока Intel содержат tbb:: распараллельте возражают, что тесно приближает C++ 0x стандарт, и Повышение имеет повышение:: библиотека потока, которая делает то же.

http://www.threadingbuildingblocks.org/

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

Используя повышение:: поток Вы получили бы что-то как:

#include <boost/thread.hpp>

void task1() { 
    // do stuff
}

void task2() { 
    // do stuff
}

int main (int argc, char ** argv) {
    using namespace boost; 
    thread thread_1 = thread(task1);
    thread thread_2 = thread(task2);

    // do other stuff
    thread_2.join();
    thread_1.join();
    return 0;
}
79
ответ дан Edward KMETT 6 December 2018 в 15:51
поделиться

Это в основном зависит от библиотеки, которой Вы решаете пользоваться. Например, если бы Вы пользуетесь wxWidgets библиотекой, создание потока было бы похоже на это:

class RThread : public wxThread {

public:
    RThread()
        : wxThread(wxTHREAD_JOINABLE){
    }
private:
    RThread(const RThread &copy);

public:
    void *Entry(void){
        //Do...

        return 0;
    }

};

wxThread *CreateThread() {
    //Create thread
    wxThread *_hThread = new RThread();

    //Start thread
    _hThread->Create();
    _hThread->Run();

    return _hThread;
}

, Если Ваш основной поток называет метод CreateThread, Вы создадите новый поток, который начнет выполнять код в Вашем методе "Записи". Необходимо будет сохранить ссылку на поток в большинстве случаев, чтобы присоединиться или остановить его. Больше информации здесь: wxThread документация

8
ответ дан LorenzCK 6 December 2018 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: