Есть ли способ сделать неизменяемую ссылку изменяемой?
blockquote>Нет.
Вы могли бы написать небезопасный код Rust, чтобы заставить типы выстраиваться в линию, но код на самом деле был бы небезопасным и приводил к неопределенному поведению . Вы не хотите этого.
Для вашей конкретной проблемы см .:
- Как удалить N-й узел из конца связанного списка?
- [111 ] Как использовать два указателя для перебора связанного списка в Rust?
Это было бы лучше обработано при наличии запланированной задачи / задание крона, которое работает в полночь?
Вы могли реализовать это (по общему признанию плохо) следующим образом:
Запишите очень легкий класс, который просто хранит текущую дату. Запустите его в отдельном потоке и заставьте его периодически проверить дату, затем спать для большого количества времени (на самом деле, Вы могли заставить его спать для просто дольше, чем время, оставленное до полуночи). Если дата изменилась, заставьте ее назвать функцию обратного вызова в основной части Вашего приложения.
Как я сказал, это не походит на блестящее решение Вашей проблемы и существуют, вероятно, намного лучшие способы сделать ее.
Вы могли бы искать Систему. Поточная обработка. Таймер. Это выстрелит в интервал, который Вы устанавливаете.
Система широковещательно передает сообщение WM_TIMECHANGE, когда пользователь изменяет системную дату / время. Корректный способ обработать это состоит в том, чтобы обработать то сообщение. Я подозреваю событие SystemEvents .NET. TimeChanged является просто оберткой вокруг этого.
Ваше приложение могло выполнить цикл, который спит в течение минуты, затем проверяет дату. Если это отличается, чем прошлый раз, выполните свою логику.
Но я соглашаюсь, что этот сценарий был бы лучше обработан с запланированной задачей.
Принятие, что Вы просите, должно знать, когда пользователь изменяет date\time их ПК, единственный способ, которым я знаю, чтобы сделать, это должно контролировать EventLog, что-то вроде этого:
static System.Diagnostics.EventLog log = new EventLog("System");
public Form1()
{
log.EntryWritten += new EntryWrittenEventHandler(log_EntryWritten);
log.EnableRaisingEvents = true;
}
void log_EntryWritten(object sender, EntryWrittenEventArgs e)
{
if (e.Entry.InstanceId == 1 && e.Entry.EntryType == EventLogEntryType.Information)
Console.WriteLine("Test");
}
Не уверенный, если бы существует событие для этого, но в противном случае применимое обходное решение должно было бы запускать таймер каждую минуту, и если время изменило больше чем 5 минут промежуточные вызовы, то можно быть вполне уверены, что время было изменено так или иначе. Вы могли пойти более мелкомодульные, если Вам нравится, путем увольнения события каждую секунду и проверки разницы во времени, больше чем 10 секунд, но каждая минута, вероятно, была бы достаточна.
Или используйте это для получения информации о DST: TimeZone. CurrentTimeZone. GetDaylightChanges (DateTime. Сегодня. Год)