//排序方法有好多种,本文是睡眠排序,数字多大就延时(数字*系数)输出,延时小的先输出,
//延时多的后输出,从而达到排序的目的。
//本文编译通过能运行。
//本文用到了TThread、TCriticalSection、WaitForMultipleObjects
//TThread是c++ builder的vcl的线程类,TCriticalSection是c++ builder的vcl的临界区类。
//WaitForMultipleObjects是Windows中的函数,几乎可以等待Windows中的所有的内核对象。
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
#include <tchar.h>
#include <stdio.h>
#include <Winapi.Windows.hpp>
#include <System.SysUtils.hpp>
#include <System.Classes.hpp>
#include <System.SyncObjs.hpp>
class TSleepThread : public TThread
{private:
int FValue;
TCriticalSection *FLock;
void __fastcall Execute()
{const HRESULT iniResult = CoInitializeEx(0, COINIT_MULTITHREADED);
if (!((iniResult == S_OK) || (iniResult == S_FALSE)))
{ printf("Failed to initialize COM library.\n");
return;
}
try
{ Sleep(1000 * FValue);
FLock->Acquire();
printf("%-3d", FValue);
FLock->Release();
}
catch (Exception &ex) {
printf("Exception inside thread.\n%ls\n", ex.Message.c_str());
}
CoUninitialize();
}
public:
TSleepThread(bool CreateSuspended, int AValue, TCriticalSection *ALock)
: TThread(CreateSuspended)
{ FValue = AValue;
FLock = ALock;
}
};
//main.cpp
#define ARR_LEN 16
int _tmain(int argc, _TCHAR* argv[])
{ int A[ARR_LEN];
THandle Handles[ARR_LEN];
TThread *Threads[ARR_LEN];
TCriticalSection *Lock;
int i;
// Generate random data
for (i = 0; i < ARR_LEN; i++)
{A[i] = Random(ARR_LEN - 1);
printf("%-3d", A[i]);
}
puts("");
// Create critical section and threads
Lock = new TCriticalSection();
for (i = 0; i < ARR_LEN; i++)
{ Threads[i] = new TSleepThread(true, A[i], Lock);
Threads[i]->Start();
Handles[i] = Threads[i]->Handle;
}
// Wait until threads terminate
// This may take up to ArrLen - 1 seconds
WaitForMultipleObjects(ARR_LEN, (void* const *)&Handles, true, INFINITE);
// Destroy thread instances
for (i = 0; i < ARR_LEN; i++)
{ delete Threads[i];
}
delete Lock;
puts("");
scanf("%c", A); // Data is discarded
return 0;
}
//本文来自官方demo