Код,
который работает в потоке,
обращается к контролу.
Всё работает замечательно, кроме, того что
контрол не есть garbage collector.
В результате утечка памяти.
Код потока завершается,
когда контрол больше не нужен.
Экземпляр контрола передаётся потоку через аргумент при старте потока (_thread.Start(this)). Метод который используется для потока статический.
garbage collector не ест контрол из-за единственной ссылки на контрол из внутреннего класса .net
ThreadHelper._startArgs <- ParameterizedThreadStart._target
Почему остаётся жить ParameterizedThreadStart не понятно. dotMemory показывает что ссылается на него regular local variable, а откуда эта variable не говорит. Возможно в пуле потоков.
Здравствуйте, igor-booch, Вы писали:
IB>Экземпляр контрола передаётся потоку через аргумент при старте потока (_thread.Start(this)). Метод который используется для потока статический.
Так не делают. Передавайте в поток делегаты которые приватно в контроле описаны и пользуйстесь контролом только из этих делегатов.
IB>>Экземпляр контрола передаётся потоку через аргумент при старте потока (_thread.Start(this)). Метод который используется для потока статический.
VC>Так не делают. Передавайте в поток делегаты которые приватно в контроле описаны и пользуйстесь контролом только из этих делегатов.
BE>Код бы увидеть какой-нибудь. В общем виде подсказать невозможно.
Пожалуйста http://files.rsdn.org/82898/DateTimePicker.zip
Поток отвечает за обработку нажатий на клавиши Вверх Вниз. Если нажать и удерживать, значение в сфокусированном поле компонента даты или времени, сначала меняется медленно потом быстрее.
Я уже знаю что делать. В поток нужно передавать не контрол, а экземпляр класса DateTimePickerState. Поток в этот экземпляр пишет, а контрол читает через Binding. Вот только не все свойства, которые меняет поток, являются Dependency. Нужно создавать наследников и в них определять Dependency обёртки над этими свойствами.
Здравствуйте, igor-booch, Вы писали:
BE>>Код бы увидеть какой-нибудь. В общем виде подсказать невозможно.
IB>Пожалуйста http://files.rsdn.org/82898/DateTimePicker.zip IB>Поток отвечает за обработку нажатий на клавиши Вверх Вниз. Если нажать и удерживать, значение в сфокусированном поле компонента даты или времени, сначала меняется медленно потом быстрее.
События вроде как и так придут пока клавиша нажата, остается только зафиксировать момент нажатия и регулировать инкремент в зависимости от того сколько времени прошло.
Не совсем понятно зачем тут потоки делать ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
IB>>Пожалуйста http://files.rsdn.org/82898/DateTimePicker.zip IB>>Поток отвечает за обработку нажатий на клавиши Вверх Вниз. Если нажать и удерживать, значение в сфокусированном поле компонента даты или времени, сначала меняется медленно потом быстрее. O>События вроде как и так придут пока клавиша нажата, остается только зафиксировать момент нажатия и регулировать инкремент в зависимости от того сколько времени прошло. O>Не совсем понятно зачем тут потоки делать ?
Если что-то выполняется в главном потоке, то UI замораживается. Если всё делать в главном потоке, то пользователь не увидит как изменяется компонент даты или времени и события также не будут приходить.
Есть совет чтобы принять события и обновить UI вызвать Dispatcher.Invoke(() => {}); или что-то подобное, но у мня это вроде не получилось, точно не помню. Конечно сначала попробовал без потока.
Здравствуйте, igor-booch, Вы писали:
IB>>>Пожалуйста http://files.rsdn.org/82898/DateTimePicker.zip IB>>>Поток отвечает за обработку нажатий на клавиши Вверх Вниз. Если нажать и удерживать, значение в сфокусированном поле компонента даты или времени, сначала меняется медленно потом быстрее. O>>События вроде как и так придут пока клавиша нажата, остается только зафиксировать момент нажатия и регулировать инкремент в зависимости от того сколько времени прошло. O>>Не совсем понятно зачем тут потоки делать ?
IB>Если что-то выполняется в главном потоке, то UI замораживается. Если всё делать в главном потоке, то пользователь не увидит как изменяется компонент даты или времени и события также не будут приходить.
Это если что-то долгое делать, а инкремент то он не замораживает процесс.
Т.е. получили событие KeyDown, прибавили значение, контролу изменили свойство Dependency CurrentValue он перерисуется когда наступит черед для Render.
Все конец KeyDown , отпустили UI поток, далее Render уже перерисует контрол и отобразится новое значение.
А где тут UI Freeze может быть ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
O>Это если что-то долгое делать, а инкремент то он не замораживает процесс. O>Т.е. получили событие KeyDown, прибавили значение, контролу изменили свойство Dependency CurrentValue он перерисуется когда наступит черед для Render. O>Все конец KeyDown , отпустили UI поток, далее Render уже перерисует контрол и отобразится новое значение. O>А где тут UI Freeze может быть ?
Мне нужно чтобы получили KeyDown и пока не получили KeyUp, каждые, допустим, 0,5 сек инструментируем CurrentValue. Можно ещё попробовать использовать DispatcherTimer.
IB>Мне нужно чтобы получили KeyDown и пока не получили KeyUp, каждые, допустим, 0,5 сек инструментируем CurrentValue. Можно ещё попробовать использовать DispatcherTimer.
Примерно так, т.е. таймеры и потоки не должны понадобится событие KeyDown само будет прилетать пока пользователь держит кнопку нажатой достаточно часто, чаще чем 0.5 сек
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
O>Примерно так, т.е. таймеры и потоки не должны понадобится событие KeyDown само будет прилетать пока пользователь держит кнопку нажатой достаточно часто, чаще чем 0.5 сек
Здравствуйте, igor-booch, Вы писали:
O>>Примерно так, т.е. таймеры и потоки не должны понадобится событие KeyDown само будет прилетать пока пользователь держит кнопку нажатой достаточно часто, чаще чем 0.5 сек
IB>А MouseDown? Там же ещё кнопки Вниз\Вверх.
Если есть возможность их описать то можно использовать <RepeatButton Interval="100" Click="WhileMouseDownHandler"/>
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов