Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 61

Как сделать, чтобы один поток не закончил работу, пока второй работает?

07.09.2016, 23:54. Показов 2761. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, есть например 2 потока, которые ну например отсчитывают в цикле до 100. Как сделать чтоб один не закончил работу пока второй работает. Можно сделать через isAlive но тогда один из них не будет завершать работу полностью, то есть будет что-то вроде
thread 1:0
thread 2:0
thread 2:1
thread 2:2
.
.
.thread 2:10
thread 1:1
и всё, а нужно чтоб поток 1 закончил работу и досчитал до 10.
Заранее благодарю=)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2016, 23:54
Ответы с готовыми решениями:

Как уведомить первый поток о том, что второй закончил свою работу
Добрый день. Проблема такая. Есть 2 класса. Первый MyLogic - отвечает за логику приложения, второй MyApplication - отвечает за его...

Как узнать закончил ли поток работу?
Для создания потоков использую ThreadPool.QueueUserWorkItem Как узнать когда, потоки закончат работу, к результату не привязать...

Как определить закончил ли работу поток?
Здравствуйте, как определить закончил ли работу поток? begin Potok1 := ParallelObj.Create(true); Potok2 :=...

4
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
08.09.2016, 00:08
Цитата Сообщение от alexandro12 Посмотреть сообщение
Подскажите, есть например 2 потока, которые ну например отсчитывают в цикле до 100. Как сделать чтоб один не закончил работу пока второй работает.
Подозреваю Вы пытаетесь о блокировках спросить? Или нет.... код давайте лучше.
0
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 61
08.09.2016, 07:43  [ТС]
Используя isAlive я сделал вот так
class Program
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  {
        public delegate void Del(Thread thread);
        public static void Func1()
        {
 
            for (int i = 1; i <= 10; i++)
            {
                Console.WriteLine(string.Format("Thread1 {0}", i));
                   Thread.Sleep(500);
            }
        }
        public static void Func2(Thread thread)
        {
 
            int i = 0;
            while (thread.IsAlive)
            {
                Console.WriteLine(string.Format("Thread2 {0}", i));
                i++;
                 Thread.Sleep(1500);
 
            }
        }
static void Main(string[] args)
        {
            Del del1 = new Del(Func2);
 
            Thread newThread = new Thread(new ThreadStart(Func1));
            newThread.Name = "thread1";
            Thread tr = new Thread(() => Func2(newThread));
            tr.Name = "thread2";
            newThread.Start();
            tr.Start();
Но в данном примере поток tr не досчитывает до конца, а нужно чтоб досчитывал. Как то так
0
Эксперт .NET
 Аватар для Rius
13098 / 7656 / 1673
Регистрация: 25.05.2015
Сообщений: 23,335
Записей в блоге: 14
08.09.2016, 08:28
Один поток не должен ждать другого, если оба считают до одного числа.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Threading;
 
namespace alexandro12
{
    class Program
    {
        static void Main(string[] args)
        {
            EventWaitHandle event1 = new EventWaitHandle(false, EventResetMode.AutoReset);
            Thread thread1 = new Thread(new ParameterizedThreadStart(Func));
            thread1.Name = "thread1";
 
            EventWaitHandle event2 = new EventWaitHandle(false, EventResetMode.AutoReset);
            Thread thread2 = new Thread(new ParameterizedThreadStart(Func));
            thread2.Name = "thread2";
 
            thread1.Start(event1);
            thread2.Start(event2);
 
            WaitHandle.WaitAll(new WaitHandle[] { event1, event2 });
        }
 
        public static void Func(object o)
        {
            for (int i = 1; i <= 10; i++)
            {
                Console.WriteLine(string.Format("{0} {1}", Thread.CurrentThread.Name, i));
                Thread.Sleep(500);
            }
 
            (o as EventWaitHandle).Set();
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Threading;
using System.Threading.Tasks;
 
namespace alexandro12
{
    class Program
    {
        static void Main(string[] args)
        {
            var task1 = Task.Factory.StartNew(() => Func("task1"));
            var task2 = Task.Factory.StartNew(() => Func("task2"));
 
            Task.WaitAll(task1, task2);
        }
 
        public static void Func(string name)
        {
            for (int i = 1; i <= 10; i++)
            {
                Console.WriteLine(string.Format("{0} {1}", name, i));
                Thread.Sleep(500);
            }
        }
    }
}
Добавлено через 8 минут
Вам на самом деле надо дождаться завершения выполнения обоих потоков.
0
0 / 0 / 0
Регистрация: 25.02.2015
Сообщений: 61
08.09.2016, 08:44  [ТС]
спасибо за помощь=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2016, 08:44
Помогаю со студенческими работами здесь

Как заставить один поток ждать, пока работает другой
Здравствуйте, стоит такая задача: есть public static bool forks = new bool;// false - свободна public void takeFirstSpoon(int...

Как синхронизировать потоки, чтобы сначала один поток, затем первый завершался и начинался второй
Как синхронизировать потоки, чтобы сначала один поток, затем первый завершался и начинался второй Родительский и вновь созданный поток...

Как сделать, чтобы один border перекрывал второй
Подскажите решение: #header .logo { float: left; border-top: 10px solid #000; height: 100px; border-left: 10px solid #f3d0bf; ...

Как сделать чтобы Button сделал работу только один раз?
Люди добрые помогите нуба) Как делать чтоб если нажал в Button в textbox.Text появился допустим &quot;+&quot; но если ещё раз нажму на...

Сделать так, чтобы только один поток обращался к PictureBox
Здравствуйте! Очень нужна ваша помощь. Я написала программу, где я запуская несколько потоков, и просто наблюдаю процесс, как эти потоки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru