mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-27 00:07:58 +01:00
This commit is contained in:
@@ -527,14 +527,19 @@ namespace Terminal.Gui.Core {
|
||||
// TODO: Add IMainLoop tests
|
||||
|
||||
volatile static int tbCounter = 0;
|
||||
static ManualResetEventSlim _wakeUp = new ManualResetEventSlim (false);
|
||||
|
||||
private static void Launch (Random r, TextField tf)
|
||||
private static void Launch (Random r, TextField tf, int target)
|
||||
{
|
||||
Task.Run (() => {
|
||||
Thread.Sleep (r.Next (2, 4));
|
||||
Application.MainLoop.Invoke (() => {
|
||||
tf.Text = $"index{r.Next ()}";
|
||||
Interlocked.Increment (ref tbCounter);
|
||||
if (target == tbCounter) {
|
||||
// On last increment wake up the check
|
||||
_wakeUp.Set ();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -542,16 +547,19 @@ namespace Terminal.Gui.Core {
|
||||
private static void RunTest (Random r, TextField tf, int numPasses, int numIncrements, int pollMs)
|
||||
{
|
||||
for (int j = 0; j < numPasses; j++) {
|
||||
|
||||
_wakeUp.Reset ();
|
||||
for (var i = 0; i < numIncrements; i++) {
|
||||
Launch (r, tf);
|
||||
Launch (r, tf, (j + 1) * numIncrements);
|
||||
}
|
||||
|
||||
|
||||
while (tbCounter != (j + 1) * numIncrements) // Wait for tbCounter to reach expected value
|
||||
{
|
||||
var tbNow = tbCounter;
|
||||
Thread.Sleep (pollMs);
|
||||
_wakeUp.Wait (pollMs);
|
||||
if (tbCounter == tbNow) {
|
||||
// No change after sleep: Idle handlers added via Application.MainLoop.Invoke have gone missing
|
||||
// No change after wait: Idle handlers added via Application.MainLoop.Invoke have gone missing
|
||||
Application.MainLoop.Invoke (() => Application.RequestStop ());
|
||||
throw new TimeoutException (
|
||||
$"Timeout: Increment lost. tbCounter ({tbCounter}) didn't " +
|
||||
@@ -572,7 +580,7 @@ namespace Terminal.Gui.Core {
|
||||
|
||||
const int numPasses = 10;
|
||||
const int numIncrements = 10000;
|
||||
const int pollMs = 500;
|
||||
const int pollMs = 20000;
|
||||
|
||||
var task = Task.Run (() => RunTest (r, tf, numPasses, numIncrements, pollMs));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user