changed thr02.cpp for a pre-c++11 compiler
This commit is contained in:
		@ -60,18 +60,29 @@ public:
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int func_ptr (QSE::Thread* thr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i = 0;
 | 
				
			||||||
 | 
						int* stopreqptr = (int*)thr->getContext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (!*stopreqptr)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							qse_mtx_lock (g_prmtx, QSE_NULL);
 | 
				
			||||||
 | 
							qse_printf (QSE_T("fp %p -> %d\n"), thr, i);
 | 
				
			||||||
 | 
							qse_mtx_unlock (g_prmtx);
 | 
				
			||||||
 | 
							i++;
 | 
				
			||||||
 | 
							sleep (1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return i;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int test1 (void)
 | 
					static int test1 (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	MyThread thr1;
 | 
					 | 
				
			||||||
	QSE::ThreadR thr2;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	int localstopreq = 0;
 | 
						int localstopreq = 0;
 | 
				
			||||||
	g_prmtx = qse_mtx_open (QSE_MMGR_GETDFL(), 0);
 | 
						g_prmtx = qse_mtx_open (QSE_MMGR_GETDFL(), 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	thr1.setStackSize (64000);
 | 
					#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900) //C++11 or later
 | 
				
			||||||
	thr2.setStackSize (64000);
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	auto lambda = [](QSE::Thread* thr)->int 
 | 
						auto lambda = [](QSE::Thread* thr)->int 
 | 
				
			||||||
	{ 
 | 
						{ 
 | 
				
			||||||
		int i = 0;
 | 
							int i = 0;
 | 
				
			||||||
@ -104,23 +115,32 @@ static int test1 (void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		return i;
 | 
							return i;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MyThread thr1;
 | 
				
			||||||
 | 
						thr1.setStackSize (64000);
 | 
				
			||||||
	if (thr1.start(QSE::Thread::SIGNALS_BLOCKED) <= -1)
 | 
						if (thr1.start(QSE::Thread::SIGNALS_BLOCKED) <= -1)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		qse_printf (QSE_T("cannot start thread1\n"));
 | 
							qse_printf (QSE_T("cannot start thread1\n"));
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						QSE::ThreadR thr2;
 | 
				
			||||||
 | 
						thr2.setStackSize (64000);
 | 
				
			||||||
 | 
						thr2.setContext (&localstopreq);
 | 
				
			||||||
 | 
					#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900) //C++11 or later
 | 
				
			||||||
	// the lambda expression with no capture can be passed as a function pointer
 | 
						// the lambda expression with no capture can be passed as a function pointer
 | 
				
			||||||
	// as long as the signature matches QSE::Thread::ThreadRoutine.
 | 
						// as long as the signature matches QSE::Thread::ThreadRoutine.
 | 
				
			||||||
	thr2.setContext (&localstopreq);
 | 
					 | 
				
			||||||
	if (thr2.start(lambda, QSE::Thread::SIGNALS_BLOCKED) <= -1)
 | 
						if (thr2.start(lambda, QSE::Thread::SIGNALS_BLOCKED) <= -1)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						if (thr2.start(func_ptr, QSE::Thread::SIGNALS_BLOCKED) <= -1)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		qse_printf (QSE_T("cannot start thread2\n"));
 | 
							qse_printf (QSE_T("cannot start thread2\n"));
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//QSE::LambdaThread thr3;
 | 
					#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900) //C++11 or later
 | 
				
			||||||
	QSE::ThreadC<decltype(lambda)> thr3 (lambda);
 | 
						QSE::ThreadC<decltype(lambda)> thr3 (lambda);
 | 
				
			||||||
	thr3.setStackSize (64000);
 | 
						thr3.setStackSize (64000);
 | 
				
			||||||
	thr3.setContext (&localstopreq);
 | 
						thr3.setContext (&localstopreq);
 | 
				
			||||||
@ -138,6 +158,7 @@ static int test1 (void)
 | 
				
			|||||||
		qse_printf (QSE_T("cannot start thread4\n"));
 | 
							qse_printf (QSE_T("cannot start thread4\n"));
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// turn a functor to a thread
 | 
						// turn a functor to a thread
 | 
				
			||||||
	QSE::ThreadC<Functor> thr5;
 | 
						QSE::ThreadC<Functor> thr5;
 | 
				
			||||||
@ -153,8 +174,10 @@ static int test1 (void)
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		if (thr1.getState() == QSE::Thread::TERMINATED && 
 | 
							if (thr1.getState() == QSE::Thread::TERMINATED && 
 | 
				
			||||||
		    thr2.getState() == QSE::Thread::TERMINATED &&
 | 
							    thr2.getState() == QSE::Thread::TERMINATED &&
 | 
				
			||||||
 | 
					#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900) //C++11 or later
 | 
				
			||||||
		    thr3.getState() == QSE::Thread::TERMINATED &&
 | 
							    thr3.getState() == QSE::Thread::TERMINATED &&
 | 
				
			||||||
		    thr4.getState() == QSE::Thread::TERMINATED &&
 | 
							    thr4.getState() == QSE::Thread::TERMINATED &&
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		    thr5.getState() == QSE::Thread::TERMINATED) break;
 | 
							    thr5.getState() == QSE::Thread::TERMINATED) break;
 | 
				
			||||||
		sleep (1);
 | 
							sleep (1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -167,14 +190,18 @@ static int test1 (void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	thr1.join ();
 | 
						thr1.join ();
 | 
				
			||||||
	thr2.join ();
 | 
						thr2.join ();
 | 
				
			||||||
 | 
					#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900) //C++11 or later
 | 
				
			||||||
	thr3.join ();
 | 
						thr3.join ();
 | 
				
			||||||
	thr4.join ();
 | 
						thr4.join ();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	thr5.join ();
 | 
						thr5.join ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	qse_printf (QSE_T("thread1 ended with retcode %d\n"), thr1.getReturnCode());
 | 
						qse_printf (QSE_T("thread1 ended with retcode %d\n"), thr1.getReturnCode());
 | 
				
			||||||
	qse_printf (QSE_T("thread2 ended with retcode %d\n"), thr2.getReturnCode());
 | 
						qse_printf (QSE_T("thread2 ended with retcode %d\n"), thr2.getReturnCode());
 | 
				
			||||||
 | 
					#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900) //C++11 or later
 | 
				
			||||||
	qse_printf (QSE_T("thread3 ended with retcode %d\n"), thr3.getReturnCode());
 | 
						qse_printf (QSE_T("thread3 ended with retcode %d\n"), thr3.getReturnCode());
 | 
				
			||||||
	qse_printf (QSE_T("thread4 ended with retcode %d\n"), thr4.getReturnCode());
 | 
						qse_printf (QSE_T("thread4 ended with retcode %d\n"), thr4.getReturnCode());
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	qse_printf (QSE_T("thread5 ended with retcode %d\n"), thr5.getReturnCode());
 | 
						qse_printf (QSE_T("thread5 ended with retcode %d\n"), thr5.getReturnCode());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	qse_mtx_close (g_prmtx);
 | 
						qse_mtx_close (g_prmtx);
 | 
				
			||||||
@ -182,7 +209,6 @@ static int test1 (void)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
static void handle_sigint (int sig, siginfo_t* siginfo, void* ctx)
 | 
					static void handle_sigint (int sig, siginfo_t* siginfo, void* ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	g_stopreq = 1;
 | 
						g_stopreq = 1;
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user