/
main.d
95 lines (79 loc) · 2.48 KB
/
main.d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import des.util;
import des.flow;
import std.random;
import core.thread;
class TestWorkElement : WorkElement, EventProcessor
{
size_t step;
string name;
this( string name )
{
this.name = name;
log_info( "create '%s'", name );
}
override void process()
{
string msg = toMessage( " element '%s' step %d", name, step++ );
pushEvent( Event( 0, msg ) );
log_info( "'%s' generate message event", name );
Thread.sleep(dur!"msecs"(100+uniform(-50,50)));
}
void processEvent( in Event ev )
{
switch( ev.code )
{
case 0:
log_info( "'%s' get message event: %s", name, ev.as!string );
break;
case Event.system_code:
log_info( "'%s' get system event: %s", name, ev.as!SysEvData );
break;
default:
log_info( "'%s' get unknown event", name );
break;
}
}
override EventProcessor[] getEventProcessors() { return [this]; }
protected void selfDestroy() { log_info( "destroy '%s'", name ); }
}
// it must be a function, not delegate
WorkElement createTestWE( string name )
{ return new TestWorkElement( name ); }
FThread[] prepare()
{
auto a = new FThread( "th1", &createTestWE, "E1" );
auto b = new FThread( "th2", &createTestWE, "E2" );
a.addListener( b );
b.addListener( a );
return [a,b];
}
void batchCommand( FThread[] list, Command cmd )
{ foreach( th; list ) th.pushCommand( cmd ); }
void batchJoin( FThread[] list )
{ foreach( th; list ) th.join(); }
void printInfo( FThread[] list )
{ foreach( th; list ) log_info( "thread info: '%s' %s", th.name, th.info.state ); }
void batchCommandWithSleep( FThread[] list, Command cmd, size_t sleep_time )
{
log_info( "##### %s", cmd );
batchCommand( list, cmd );
// can print wrong info because command in
// thread can be not processed yet
printInfo( list );
Thread.sleep( dur!"msecs"(sleep_time) );
}
void main()
{
auto list = prepare();
Thread.sleep(dur!"msecs"(50));
batchCommandWithSleep( list, Command.START, 400 );
batchCommandWithSleep( list, Command.PAUSE, 400 );
batchCommandWithSleep( list, Command.START, 400 );
batchCommandWithSleep( list, Command.REINIT, 200 );
batchCommandWithSleep( list, Command.START, 400 );
batchCommandWithSleep( list, Command.CLOSE, 200 );
log_info( "join threads" );
batchJoin( list );
Thread.sleep(dur!"msecs"(10));
log_info( "finish" );
}