powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Завершение потока извне
5 сообщений из 5, страница 1 из 1
Завершение потока извне
    #38558779
RomanA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу на MFC, ситуация:

Есть модальный диалог, в котором есть долгопрогружаемый комбо-бокс (инициализируется порядка нескольких секунд). Чтобы пользователь не терял время, ожидая прогрузки всего диалога, написал класс, который на месте комбо-бокса отображает анимацию загрузки, в то время как остальные контролы диалога уже доступны и работают. Сам комбо-бокс инициализирую в отдельном потоке.

Все работает замечательно за исключением одной особенности: если я закрываю окно диалога до завершения полной инициализации, то указатель на комбо-бокс в функции потока становится невалидным. Соответственно, нужно как-то завершать поток наполнения извне, при закрытии диалога.

Использовать булевую переменную - не вариант, так как тогда придется при каждой попытке доступа к контролу ее проверять (в комбо-бокс грузятся порядка 300000 значений). Кроме того, класс в некотором роде универсальный и планируется использоваться в других местах, а такое решение накладывает значительное ограничение на передаваемую в поток функцию: тот кто ее использует обязан помнить о переменной.

Использовать TerminateThread не советует MSDN.

В данный момент застрял и не знаю что можно сделать. Может быть кто-нибудь сталкивался с подобной проблемой? Есть идеи?
...
Рейтинг: 0 / 0
Завершение потока извне
    #38558787
Alex the coder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanA, а что значит "невалидным" - ноль, спец-значение или вообще не пойми что?
Так-то в MFC вроде были служебные функции для проверки корректности указателя.
Еще кстати есть сомнения, что с GUI можно работать из другого, не главного, потока и при этом корректно...
...
Рейтинг: 0 / 0
Завершение потока извне
    #38558842
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RomanA,

0) Зачем тебе 300000 значений в комбике ? Я в своё время сталкивался с подобной задачей на 30 тыщах значений, и то это было очень много. С этим комбом просто невозможно будет работать, и всё.
Мораль: тебе надо решать другую задачу, как переделать твоё приложение, что бы не сосать все эти записи на клинта, а использовать какой-то интеллектуальный поиск прямо в БД.

1) Завершать потоки принудительно очень сложно. Невыгодно. Считай, что это невозможно (это возможно технически, но у тебя в приложении от этого будут сплошные проблемы). Поэтому твой поток ДОЛЖЕН завершиться сам, скачав из БД эти данные. И сохранить их куда-то, что будет независимо от наличия твоего диалога. А диалог оттуда должен эти данные при надобности взять.

2) Если твой комбик загружается несколько секунд, лучше и проще просто пользователю подождать.
Если у тебя на форме есть комбик, то, видимо, он нужен пользователю. Если он нужен пользователю, то видимо, пользователь не сможет продолжить работу с твоей формой пока комбик не загружен. А если так, то ты плохо решил свою задачу, поскольку всё сделано зря.

4)
авторИспользовать булевую переменную - не вариант, так как тогда придется при каждой попытке доступа к контролу ее проверять (в комбо-бокс грузятся порядка 300000 значений).

Очевидно, для этой цели надо использовать Event-ы. И ссылки на окна в виде HWND, а не в виде указателя.

5) На счёт "класс в некотором роде универсальный и планируется использоваться в других местах" я сомневаюсь. Это дурацкое решение дурацкой проблемы.
...
Рейтинг: 0 / 0
Завершение потока извне
    #38567767
RomanA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь за долгий ответ, были другие задачи.

Alex the coderRomanA, а что значит "невалидным" - ноль, спец-значение или вообще не пойми что?
Так-то в MFC вроде были служебные функции для проверки корректности указателя.
Еще кстати есть сомнения, что с GUI можно работать из другого, не главного, потока и при этом корректно...

По сути - не пойми что. Указатель я получал просто взяв адрес от переменной CComboBox. После исчезновения диалога, указатель указывает непонятно куда.


MasterZiv0) Зачем тебе 300000 значений в комбике ? Я в своё время сталкивался с подобной задачей на 30 тыщах значений, и то это было очень много. С этим комбом просто невозможно будет работать, и всё.
Мораль: тебе надо решать другую задачу, как переделать твоё приложение, что бы не сосать все эти записи на клинта, а использовать какой-то интеллектуальный поиск прямо в БД.

Архитектура приложения устроена так, что к моменту вызова диалога записи уже есть на клиентском месте, мне нужно их лишь отображать и позволять выбирать. Да и от CComboBox отнаследован класс, который позволяет искать в строке комбо-бокса. Мне кажется, что достаточно удобно, за исключением скорости его заполнения на большом числе данных...

Хотя, конечно, в данном случае вообще можно обойтись без комбо-бокса (или сделать его подгрузку динамической), но увы, ТЗ пишу не я. :)

MasterZiv2) Если твой комбик загружается несколько секунд, лучше и проще просто пользователю подождать.
Если у тебя на форме есть комбик, то, видимо, он нужен пользователю. Если он нужен пользователю, то видимо, пользователь не сможет продолжить работу с твоей формой пока комбик не загружен. А если так, то ты плохо решил свою задачу, поскольку всё сделано зря.

Тут есть одна особенность. Есть несколько клиентов, одному из которых комбо-бокс нужен в обязательном порядке. Остальным он не нужен вообще. И приходится как-то лавировать...

MasterZiv1) Завершать потоки принудительно очень сложно. Невыгодно. Считай, что это невозможно (это возможно технически, но у тебя в приложении от этого будут сплошные проблемы). Поэтому твой поток ДОЛЖЕН завершиться сам, скачав из БД эти данные. И сохранить их куда-то, что будет независимо от наличия твоего диалога. А диалог оттуда должен эти данные при надобности взять.

Очевидно, для этой цели надо использовать Event-ы. И ссылки на окна в виде HWND, а не в виде указателя.


В общем, примерно так и поступил: выставляю событие, а в функции наполнения периодически проверяю его, после чего выхожу.

Всем спасибо за помощь!
...
Рейтинг: 0 / 0
Завершение потока извне
    #38567861
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторАрхитектура приложения устроена так, что к моменту вызова диалога записи уже есть на клиентском месте, мне нужно их лишь отображать и позволять выбирать. Да и от CComboBox отнаследован класс, который позволяет искать в строке комбо-бокса. Мне кажется, что достаточно удобно, за исключением скорости его заполнения на большом числе данных...

Тогда я не понимаю, чего там ждать...
В комбик записи-то набиваются мгновенно.


авторХотя, конечно, в данном случае вообще можно обойтись без комбо-бокса (или сделать его подгрузку динамической), но увы, ТЗ пишу не я. :)

Так сходи к тому, кто его пишет, и скажи "А какого #### ...".



авторТут есть одна особенность. Есть несколько клиентов, одному из которых комбо-бокс нужен в обязательном порядке. Остальным он не нужен вообще. И приходится как-то лавировать...


Сделай две формы. Или одну с параметрическим созданием и загрузкой этого комбика.
Чё как маленький -то ?


авторВ общем, примерно так и поступил: выставляю событие, а в функции наполнения периодически проверяю его, после чего выхожу.


Что делает функция наполнения ?

Ещё раз, если ты не понял, дублирую открытым текстом:

использовать комбик с таким кол-вом записей -- идиотизм.

грузить комбик в фоне -- ненусветная глупость

если имеется в виду именно наполнение комбика item-ами, а не загрузка из БД, то это -- ненусветная глупость 100-кратно.

Итого твоя деятельность -- идиотизм чистой воды чуть менее чем на 99 процентов.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Завершение потока извне
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]