Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Завершение потока извне
|
|||
|---|---|---|---|
|
#18+
Пишу на MFC, ситуация: Есть модальный диалог, в котором есть долгопрогружаемый комбо-бокс (инициализируется порядка нескольких секунд). Чтобы пользователь не терял время, ожидая прогрузки всего диалога, написал класс, который на месте комбо-бокса отображает анимацию загрузки, в то время как остальные контролы диалога уже доступны и работают. Сам комбо-бокс инициализирую в отдельном потоке. Все работает замечательно за исключением одной особенности: если я закрываю окно диалога до завершения полной инициализации, то указатель на комбо-бокс в функции потока становится невалидным. Соответственно, нужно как-то завершать поток наполнения извне, при закрытии диалога. Использовать булевую переменную - не вариант, так как тогда придется при каждой попытке доступа к контролу ее проверять (в комбо-бокс грузятся порядка 300000 значений). Кроме того, класс в некотором роде универсальный и планируется использоваться в других местах, а такое решение накладывает значительное ограничение на передаваемую в поток функцию: тот кто ее использует обязан помнить о переменной. Использовать TerminateThread не советует MSDN. В данный момент застрял и не знаю что можно сделать. Может быть кто-нибудь сталкивался с подобной проблемой? Есть идеи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 16:47 |
|
||
|
Завершение потока извне
|
|||
|---|---|---|---|
|
#18+
RomanA, а что значит "невалидным" - ноль, спец-значение или вообще не пойми что? Так-то в MFC вроде были служебные функции для проверки корректности указателя. Еще кстати есть сомнения, что с GUI можно работать из другого, не главного, потока и при этом корректно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 16:54 |
|
||
|
Завершение потока извне
|
|||
|---|---|---|---|
|
#18+
RomanA, 0) Зачем тебе 300000 значений в комбике ? Я в своё время сталкивался с подобной задачей на 30 тыщах значений, и то это было очень много. С этим комбом просто невозможно будет работать, и всё. Мораль: тебе надо решать другую задачу, как переделать твоё приложение, что бы не сосать все эти записи на клинта, а использовать какой-то интеллектуальный поиск прямо в БД. 1) Завершать потоки принудительно очень сложно. Невыгодно. Считай, что это невозможно (это возможно технически, но у тебя в приложении от этого будут сплошные проблемы). Поэтому твой поток ДОЛЖЕН завершиться сам, скачав из БД эти данные. И сохранить их куда-то, что будет независимо от наличия твоего диалога. А диалог оттуда должен эти данные при надобности взять. 2) Если твой комбик загружается несколько секунд, лучше и проще просто пользователю подождать. Если у тебя на форме есть комбик, то, видимо, он нужен пользователю. Если он нужен пользователю, то видимо, пользователь не сможет продолжить работу с твоей формой пока комбик не загружен. А если так, то ты плохо решил свою задачу, поскольку всё сделано зря. 4) авторИспользовать булевую переменную - не вариант, так как тогда придется при каждой попытке доступа к контролу ее проверять (в комбо-бокс грузятся порядка 300000 значений). Очевидно, для этой цели надо использовать Event-ы. И ссылки на окна в виде HWND, а не в виде указателя. 5) На счёт "класс в некотором роде универсальный и планируется использоваться в других местах" я сомневаюсь. Это дурацкое решение дурацкой проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 17:28 |
|
||
|
Завершение потока извне
|
|||
|---|---|---|---|
|
#18+
Извиняюсь за долгий ответ, были другие задачи. Alex the coderRomanA, а что значит "невалидным" - ноль, спец-значение или вообще не пойми что? Так-то в MFC вроде были служебные функции для проверки корректности указателя. Еще кстати есть сомнения, что с GUI можно работать из другого, не главного, потока и при этом корректно... По сути - не пойми что. Указатель я получал просто взяв адрес от переменной CComboBox. После исчезновения диалога, указатель указывает непонятно куда. MasterZiv0) Зачем тебе 300000 значений в комбике ? Я в своё время сталкивался с подобной задачей на 30 тыщах значений, и то это было очень много. С этим комбом просто невозможно будет работать, и всё. Мораль: тебе надо решать другую задачу, как переделать твоё приложение, что бы не сосать все эти записи на клинта, а использовать какой-то интеллектуальный поиск прямо в БД. Архитектура приложения устроена так, что к моменту вызова диалога записи уже есть на клиентском месте, мне нужно их лишь отображать и позволять выбирать. Да и от CComboBox отнаследован класс, который позволяет искать в строке комбо-бокса. Мне кажется, что достаточно удобно, за исключением скорости его заполнения на большом числе данных... Хотя, конечно, в данном случае вообще можно обойтись без комбо-бокса (или сделать его подгрузку динамической), но увы, ТЗ пишу не я. :) MasterZiv2) Если твой комбик загружается несколько секунд, лучше и проще просто пользователю подождать. Если у тебя на форме есть комбик, то, видимо, он нужен пользователю. Если он нужен пользователю, то видимо, пользователь не сможет продолжить работу с твоей формой пока комбик не загружен. А если так, то ты плохо решил свою задачу, поскольку всё сделано зря. Тут есть одна особенность. Есть несколько клиентов, одному из которых комбо-бокс нужен в обязательном порядке. Остальным он не нужен вообще. И приходится как-то лавировать... MasterZiv1) Завершать потоки принудительно очень сложно. Невыгодно. Считай, что это невозможно (это возможно технически, но у тебя в приложении от этого будут сплошные проблемы). Поэтому твой поток ДОЛЖЕН завершиться сам, скачав из БД эти данные. И сохранить их куда-то, что будет независимо от наличия твоего диалога. А диалог оттуда должен эти данные при надобности взять. Очевидно, для этой цели надо использовать Event-ы. И ссылки на окна в виде HWND, а не в виде указателя. В общем, примерно так и поступил: выставляю событие, а в функции наполнения периодически проверяю его, после чего выхожу. Всем спасибо за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2014, 16:21 |
|
||
|
Завершение потока извне
|
|||
|---|---|---|---|
|
#18+
авторАрхитектура приложения устроена так, что к моменту вызова диалога записи уже есть на клиентском месте, мне нужно их лишь отображать и позволять выбирать. Да и от CComboBox отнаследован класс, который позволяет искать в строке комбо-бокса. Мне кажется, что достаточно удобно, за исключением скорости его заполнения на большом числе данных... Тогда я не понимаю, чего там ждать... В комбик записи-то набиваются мгновенно. авторХотя, конечно, в данном случае вообще можно обойтись без комбо-бокса (или сделать его подгрузку динамической), но увы, ТЗ пишу не я. :) Так сходи к тому, кто его пишет, и скажи "А какого #### ...". авторТут есть одна особенность. Есть несколько клиентов, одному из которых комбо-бокс нужен в обязательном порядке. Остальным он не нужен вообще. И приходится как-то лавировать... Сделай две формы. Или одну с параметрическим созданием и загрузкой этого комбика. Чё как маленький -то ? авторВ общем, примерно так и поступил: выставляю событие, а в функции наполнения периодически проверяю его, после чего выхожу. Что делает функция наполнения ? Ещё раз, если ты не понял, дублирую открытым текстом: использовать комбик с таким кол-вом записей -- идиотизм. грузить комбик в фоне -- ненусветная глупость если имеется в виду именно наполнение комбика item-ами, а не загрузка из БД, то это -- ненусветная глупость 100-кратно. Итого твоя деятельность -- идиотизм чистой воды чуть менее чем на 99 процентов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2014, 17:17 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=64&tid=2019669]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 188ms |

| 0 / 0 |
