Size: a a a

2021 September 24

KD

Konstantin Drakos in С#
Добрый день, разбирал тут Мьютексы на примере спящего брадобрея и наткнулся на проблему, что дальше одного потока не создаётся, хотя вроде мьютекс отпускается и должно всё работать. Подозреваю проблему во время старта потока. Можете подсказать, где загвоздка и куда копать?
https://pastebin.com/icrBKQqn
источник

Э

Эдуард in С#
Хм, народ, доброе утро. У меня есть DataTable в DataGridView и List с данными, соответствующие DataTable. Как мне получить элемент листа по выбранному элементу таблицы данных?
источник

ЛЮ

Леонид Юдин... in С#
List[DataGridView.CurrentRow.Index] ?
источник

Э

Эдуард in С#
Но если грид был отсортирован?
источник

ЛЮ

Леонид Юдин... in С#
List.Where(x => x == DataGridView.CurrentCell.Value) или что-то типо.
источник

OR

Oleg Ruban in С#
У тебя там несколько неприятностей в программе
источник

ЛЮ

Леонид Юдин... in С#
Или CurrentRow с индексом, указывающего на Id.
источник

ЛЮ

Леонид Юдин... in С#
Что-то типа List.Where(x => x.Id == DataGridView.CurrentRow[0].Value)
источник

OR

Oleg Ruban in С#
Но то о чём ты спрашиваешь скорее всего связано с тем, что ты теряешь указательна поток до его завершения
источник

ШН

Шерзод Немножко Токс... in С#
создаются, только у тебя всё так как надо работает
источник

M

Mesa in С#
int realindex = dataGrid
 .SelectedItems
 .Cast<DataRowView>()
 .Select(view => dataTable.Rows.IndexOf(view.Row));
источник

OR

Oleg Ruban in С#
class Program
   {
       static Mutex Barber = new Mutex();
       static int[] seats = new int[8] { 100, 100, 100, 100, 100, 100, 100, 100 };
       static Random rand = new Random();

       static int x = 0;
       static void Main(string[] args)
       {
           Thread[] myThreads = new Thread[seats.Length];
           for (int i = 1; i < 30; i++)
           {

               Console.WriteLine("Пришел " + $"клиент - {i}");
               for (int z = 0; z < seats.Length; z++)
               {
                   if (seats[z] != 100)
                   {
                       if (z == seats.Length - 1)
                       {
                           Console.WriteLine($"клиент - {i}" + " видит, что все места заняты, и уходит");
                       }
                       continue;
                   }
                   else if (seats[z] == 100)
                   {
                       seats[z] = i;
                       Console.WriteLine($"клиент - {i}" + $" занял кресло {z + 1}");
                       myThreads[z] = new Thread(Count);
                       myThreads[z].Name = "Поток " + i.ToString();
                       myThreads[z].Start();
                       break;
                   }
               }
               int cooldown = rand.Next(1000, 5000);
               Thread.Sleep(cooldown);
           }
       }
       public static void Count()
       {
           Barber.WaitOne();
           Fifo(x);
           Console.WriteLine("Парикмахер подходит к покупателю " + seats[x] + " и начинает стричь.");
           Thread.Sleep(5000);
           Console.WriteLine("Парикмахер заканчивает стрижку");
           Console.WriteLine($"Кресло {x} освободилось");
           seats[x] = 100;
           Barber.ReleaseMutex();
       }
       public static int Fifo(int z)
       {
           for (x = 0; x < seats.Length; x++)
           {
               if (seats[x] == seats.Min())
               {
                   //x = z;
                   break;
               }
           }
           return x;
       }
   }
источник

OR

Oleg Ruban in С#
Так будет то что ты хотел
источник

KD

Konstantin Drakos in С#
Он создаётся, но только на первое место.
источник

ШН

Шерзод Немножко Токс... in С#
во первых, после цикла с созданием, ты не ожидаешь завершения потоков, нужно добавить Thread.Join что-то там
источник

OR

Oleg Ruban in С#
Ну или дейтсвительно дожидаться его завершения
источник

OR

Oleg Ruban in С#
В Fifo  у тя тож косяк был, ты локальную переменну х объявил и соотвесвенно все операции над переменно х у тебя сохранялсиь внутри этого метода не влияя на статическую переменную х
источник

KD

Konstantin Drakos in С#
справедливо, не заметил
источник

KD

Konstantin Drakos in С#
Получается, надо было задать количество потоков?
источник

OR

Oleg Ruban in С#
Нет, дело не в этом. А в том что когда ты выполняешь
myThread = new Thread(Count);
ты теряешь ссылку на поток. Он мог ещё не завершится, а ты его уже потерял. Сборщик мусора мог его собрать до того как он отпустит мьютекс
источник