Я вижу, что таймауты используются для этого много, но в контексте события вы не можете посмотреть на координаты, например:
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: это хорошая идея, но не работают достаточно последовательно. Возможно, с небольшими ухищрениями.
Ну, технически любой такой объект завершит то, чтобы быть созданным по библиотеке потока 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;
}
Это в основном зависит от библиотеки, которой Вы решаете пользоваться. Например, если бы Вы пользуетесь wxWidgets библиотекой, создание потока было бы похоже на это:
class RThread : public wxThread {
public:
RThread()
: wxThread(wxTHREAD_JOINABLE){
}
private:
RThread(const RThread ©);
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 документация