Вот пример легкой системы с помощью синхронизации потока и асинхронного вызова.
я знаю, что существуют некоторые оборотные стороны, но мне нравится использовать это вместо таймера при начинании длительного процесса (как schedualed серверные службы). Так как это работает встроенный в потоке таймера, Вы не должны волноваться об этом начинаемый снова перед, первоначальный вызов закончился. Это могло быть расширено вполне немного, чтобы заставить его использовать массив datetimes как триггерные времена или добавить еще некоторые способности к нему. Я уверен некоторые из Вас, парни там знают некоторые лучшие пути.
public Form1()
{
InitializeComponent();
//some fake data, obviously you would have your own.
DateTime someStart = DateTime.Now.AddMinutes(1);
TimeSpan someInterval = TimeSpan.FromMinutes(2);
//sample call
StartTimer(someStart,someInterval,doSomething);
}
//just a fake function to call
private bool doSomething()
{
DialogResult keepGoing = MessageBox.Show("Hey, I did something! Keep Going?","Something!",MessageBoxButtons.YesNo);
return (keepGoing == DialogResult.Yes);
}
//The following is the actual guts.. and can be transplanted to an actual class.
private delegate void voidFunc<P1,P2,P3>(P1 p1,P2 p2,P3 p3);
public void StartTimer(DateTime startTime, TimeSpan interval, Func<bool> action)
{
voidFunc<DateTime,TimeSpan,Func<bool>> Timer = TimedThread;
Timer.BeginInvoke(startTime,interval,action,null,null);
}
private void TimedThread(DateTime startTime, TimeSpan interval, Func<bool> action)
{
bool keepRunning = true;
DateTime NextExecute = startTime;
while(keepRunning)
{
if (DateTime.Now > NextExecute)
{
keepRunning = action.Invoke();
NextExecute = NextExecute.Add(interval);
}
//could parameterize resolution.
Thread.Sleep(1000);
}
}
Вы должны сохранить флаг при первом закрытии, в функции, которую вы передаете в $ (document) .ready
, установите его в истинное состояние при нажатии кнопок "следующий / предыдущий" , и верните значение false, когда вкладка была показана, при этом вы сможете изменить вкладку только с помощью кнопок.
Проверьте этот рабочий пример и следующий фрагмент кода:
$(document).ready(function(){
var allowTabChange = false;
var $myTabs = $("#tabs");
$myTabs.tabs({
select: function(event, ui) { return allowTabChange; },
show: function(event, ui) { allowTabChange = false; },
});
$('#nextButton').click(function(){offsetTab(1);});
$('#prevButton').click(function(){offsetTab(-1);});
// Helper functions
function offsetTab(offset){
var tab_num = $myTabs.tabs('option', 'selected');
var nextTab = tab_num + offset;
if ( check_tab(nextTab) ) {
allowTabChange = true;
$myTabs.tabs('select', nextTab);
}
}
function check_tab(tab_num){
return tab_num >= 0 && tab_num < $myTabs.tabs('length');
}
});
Have you tried setting the event option to something that isn't likely to be fired (if at all)?
For instance:
$('#tabs').tabs({ event: 'change' });
or
$('#tabs').tabs({ event: '' }); //probably better