summaryrefslogtreecommitdiff
path: root/support/dktools/DkWxProcessingController.cpt
blob: 6bd67dc7b0cde5af1e1e03f55d4b3ac21e3c3a4b (plain)
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
96
%%	options

copyright owner	=	Dirk Krause
copyright year	=	2013-xxxx
license		=	bsd

%%	header

#include <dk3conf.h>
#include <dk3types.h>
#include <dk3const.h>

#include <wx/wxprec.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
#include <wx/thread.h>



/**	Protect code from concurrent execution, mainly for timer handlers.
	In contrast to a critical section which delays execution of
	code to avoid concurrent access to data this class skips
	the execution of concurrent code.
*/
class DkWxProcessingController
{
  protected:

    /**	Prevent concurrent access.
    */
    wxMutex	mxProtectProcessing;

    /**	Flag: Processing is running.
    */
    bool	bIsRunning;

  public:
    /**	Default constructor.
    */
    DkWxProcessingController();

    /**	Begin processing if not already running.
    	If the function returns true you must invoke endProcessing()
	when your processing is finished.
    	@return	true to start processing, false if processing is running.
    */
    bool	canBeginProcessing(void);

    /**	End processing. Call this function after finishing the
    	critical code.
    */
    void	endProcessing(void);
};

%%	module

#include "DkWxProcessingController.h"

$!trace-include

DkWxProcessingController::DkWxProcessingController()
{
  bIsRunning = false;
}



bool
DkWxProcessingController::canBeginProcessing(void)
{
  bool back = false;
  {
    wxMutexLocker	lock(mxProtectProcessing);
    if(!(bIsRunning)) {
      bIsRunning = true;
      back = true;
    }
  }
  return back;
}



void
DkWxProcessingController::endProcessing(void)
{
  wxMutexLocker	lock(mxProtectProcessing);
  bIsRunning = false;
}