Michael Haephrati Ответов: 1

Как создать многопоточное приложение на языке C#, где каждый поток имеет свое собственное окно


Я пытаюсь создать многопоточное приложение на языке c#, где каждый поток имеет свое собственное окно, чтобы его можно было использовать для взаимодействия с каждым из этих потоков. Взаимодействие может осуществляться либо через окно консоли, либо через диалоговое окно.

Что я уже пробовал:

Я попробовал добавить консоль.WriteLine и консоль.ReadLine для каждой функции потока. Наверное, не самый лучший подход...

0x01AA

Вы можете посмотреть здесь: Создание окон в потоках - Win32 apps | Microsoft Docs[^] uups, это W32, извините

Dave Kreskowiak

Приложение может иметь только одну консоль, подключенную к нему, так что ваша идея (я думаю!) иметь консоль на поток не будет работать.

Похоже, вам нужно будет завершить редизайн вашего приложения.

Michael Haephrati

Дэйв, да. Это моя идея, но если бы это была программа Win32 c++, я бы мог добавить свое собственное консольное окно для каждого потока. Вы даже можете добавить окно консоли в приложение на основе диалогового окна. Я не знаю ответа, когда дело доходит до c#.

Dave Kreskowiak

Вообще-то, нет, не можешь. Во всяком случае, не в том же самом процессе. Windows предотвращает это.

Однако вы можете даже в C# создать другое "вспомогательное приложение", которое просто предоставляет именованный канал и выводит его в свое собственное окно консоли. Затем вы можете запустить множество этих помощников, как вы хотите, общаясь с каждым через трубу, говоря им, что отображать в своих консолях.

Из документов на AllocConsole:
Процесс может быть связан только с одной консолью, поэтому функция AllocConsole завершается ошибкой, если вызывающий процесс уже имеет консоль.

Michael Haephrati

Итак, мой код https://www.codeproject.com/Articles/3135812/Creating-a-Console-Based-Window-for-Debugging не будет работать даже из приложения диалогового окна с несколькими потоками?

1 Ответов

Рейтинг:
0

OriginalGriff

В значительной степени, вы не можете - или, по крайней мере, не напрямую. Проблема в том, что потоки не имеют окон, и в приложении есть только один поток пользовательского интерфейса. Как только вы доберетесь до Windows, а не с помощью консоли, только этот единственный поток пользовательского интерфейса может получить доступ к любым элементам управления, поэтому становится сложно обновить windows из вторичных потоков (вы должны переместить код доступа обратно в поток пользовательского интерфейса с помощью процесса, называемого вызовом).

Однако есть один способ сделать это довольно легко: использовать BackgroundWorker [^] для запуска каждого потока и связывания этого работника с определенным окном. Фоновые рабочие имеют событие для отчета о прогрессе, которое позволяет передавать информацию из рабочего потока в поток пользовательского интерфейса для обновления, и если рабочий "уволен" самой формой, то событие прогресса получит форму для отображения как this в обычным способом.

Имейте в виду, что увеличение количества потоков не может ускорить работу приложения, скорее наоборот, можно резко замедлить работу приложения, добавив слишком много потоков!