9 / 9 / 2
Регистрация: 06.10.2011
Сообщений: 91
1

Если запустить 2 потока, будет ли один ждать, пока завершится другой

20.02.2012, 15:24. Показов 2152. Ответов 12
Метки нет (Все метки)

Здравствуйте!
Возможно вопрос глупый, но вот никак не пойму
Есть цыкл каторый выполняеться n-е количество раз.
например, в цыкле нужно запустить два патока один выполняет n=0 второй n=0+1
как они будут выполняться например второй поток завершиться раньше чем первый, что будет дальше? цыкл пойдет дальше или будет ждать окончания первого?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2012, 15:24
Ответы с готовыми решениями:

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

Как заставить поток ждать, пока не будет выполнено определенное действие?
Добрый день. Решил написать небольшую игру в VB .NET Первая версия оказалась рабочей, однако я ее...

Чему равна вероятность того, что ни один покупатель не будет ждать сдачу?
У театральной кассы стоят в очереди 10 человек. Среди них 5 человек имеют только тысячные купюры, а...

Если елементы массива соседние одинаковы то один из них заменяется на 0 а другой увеличиваетмя на один
#include "stdafx.h" #include<string> #include <cmath> #include <iostream> #include<locale>...

12
Эксперт Java
4087 / 3821 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
20.02.2012, 15:58 2
Пойдет дальше, но если нужно можно сказать ему чтобы подождал.
1
9 / 9 / 2
Регистрация: 06.10.2011
Сообщений: 91
20.02.2012, 16:05  [ТС] 3
вот задача чтобы подождал завершения всех потоков в цикле, а потом уже продолжился цикл, как реализовать не подскажите?
как вообще я понял цикл вообще будет продолжаться если ожидание не включить, тобиш он открыл два потока, потом еще два и тд. неожидание закрытия первых, если не прав поправьте пожалуйто
0
Эксперт Java
4087 / 3821 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
20.02.2012, 16:22 4
Цитата Сообщение от gunghost Посмотреть сообщение
вот задача чтобы подождал завершения всех потоков в цикле, а потом уже продолжился цикл, как реализовать не подскажите?
у класса Thread есть метод Join - он "ждет" пока поток не завершится.

Цитата Сообщение от gunghost Посмотреть сообщение
как вообще я понял цикл вообще будет продолжаться если ожидание не включить, тобиш он открыл два потока, потом еще два и тд. неожидание закрытия первых, если не прав поправьте пожалуйто
Да,будет продолжаться, в основном потоке.
1
9 / 9 / 2
Регистрация: 06.10.2011
Сообщений: 91
20.02.2012, 16:47  [ТС] 5
Вот еще вопрос, создал я потоки, все хорошо, но например когда они работают, интерфейс программы по пррежнему тормозит, процессор не загружен, все впорядке, в чем проблема? или это из-за дебаг режима?
0
Эксперт .NET
4430 / 2090 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
20.02.2012, 17:00 6
Цитата Сообщение от gunghost Посмотреть сообщение
Вот еще вопрос, создал я потоки, все хорошо, но например когда они работают, интерфейс программы по пррежнему тормозит, процессор не загружен, все впорядке, в чем проблема? или это из-за дебаг режима?
Код покажи.
0
9 / 9 / 2
Регистрация: 06.10.2011
Сообщений: 91
20.02.2012, 17:10  [ТС] 7
C#
1
2
3
4
5
string pol = "0";
            System.Threading.Thread processs1 = new System.Threading.Thread(new ThreadStart(delegate()
            {
                poly4ka(pol);
            }));
processs1.Start();
и так в нескольких кнопках,
дальше запускаеться цикл и тд.. и тд. и тд..
проблема в приоритетах на сколько я понимаю, как мне выделить основной то поток чтобы его не заглушало?
0
Эксперт .NET
4430 / 2090 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
20.02.2012, 17:13 8
Покажи весь код, как и где запускаешь потоки, можешь метод не показывать poly4ka (хотя причина может быть как раз в нём), покажи всё остальное, что связано с потоками. Весь код формы.

Добавлено через 33 секунды
Из того, что ты выложил, видно что ты запускаешь поток, толку от этого кода ноль.
0
9 / 9 / 2
Регистрация: 06.10.2011
Сообщений: 91
20.02.2012, 17:30  [ТС] 9
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
        public Image DownloadImage(string _URL)
        {
        Finish:
        
            if (igh > proxyNum - 1)
            {
                igh = 0;
            }
            if (ifd > 0)
            {
                for (int jh = 0; jh < ifd; jh++)
                {
                    if (igl[jh] == igh)
                    {
                        igh++;
                        goto Finish;
                    }
                }
            }
            Image _tmpImage = null;
 
            try
            {
 
                // Open a connection
                System.Net.HttpWebRequest _HttpWebRequest = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(_URL);
                _HttpWebRequest.Proxy = null;
 
                _HttpWebRequest.AllowWriteStreamBuffering = true;
 
                // You can also specify additional header values like the user agent or the referer: (Optional)
                _HttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
                _HttpWebRequest.Referer = "http://www.google.com/";
                _HttpWebRequest.Proxy = new WebProxy(proxy[igh]);
 
                // set timeout for 20 seconds (Optional)
                _HttpWebRequest.Timeout = 15000;
                helper1++;
                if (helper1 > 10)
                {
                    helper1 = 0;
                    igh++;
                }
                // Request response:
                System.Net.WebResponse _WebResponse = _HttpWebRequest.GetResponse();
 
                // Open data stream:
                System.IO.Stream _WebStream = _WebResponse.GetResponseStream();
 
                // convert webstream to image
                _tmpImage = Image.FromStream(_WebStream);
 
                // Cleanup
                _WebResponse.Close();
                _WebResponse.Close();
            }
            catch 
            {
                MessageBox.Show("Ошибка прокси в изображении" + igh);
                igl[ifd] = igh;
                ifd++;
                igh++;
                goto Finish;
            }
 
            return _tmpImage;
        }
в большей степени грешу вот на это, таймаут меня смущает сильно, 80 процентов что из-за этого
там все связано с этими потоками, нет смысла все скидоовать
Мнения эксперрта нужно) может быть из-за этого? ну типо когда нет отклика, ждет, а это подвисания вызывает
0
Эксперт .NET
4430 / 2090 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
20.02.2012, 18:02 10
Никаких тормозов интерфейса не будет вызывать ожидание отклика от сервера, если оно работает в другом потоке и не обращается к элементам управления на форме. Короче я больше уговаривать не буду. Тут экспертом быть не надо, чтобы понять из-за чего окно виснет, тут просто нужно понимать некоторые моменты.
1
9 / 9 / 2
Регистрация: 06.10.2011
Сообщений: 91
20.02.2012, 18:22  [ТС] 11
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
using MySql.Data.MySqlClient;
using System.Net.Sockets;
using System.Threading;
using Org.Mentalis.Network.ProxySocket;
 
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        string[] proxy = new string[1000];
        int proxyNum = 0;
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
            StreamReader sr=new StreamReader(@"C:\123\123.txt");            
            while (!sr.EndOfStream)
            {
                proxy[proxyNum] = sr.ReadLine();
                proxyNum++;
            //бла-бла-бла
            }
            sr.Close();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
                       
 
            string insertSQL = "INSERT INTO zadanie (`scill`, `label1`, `label2`, `label3`, `obr`) VALUES ('" + textBox1.Text + "',  '"
                + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','0')";
            MySqlConnection myConnection = new MySqlConnection(Connect);
 
            myConnection.Open();
            MySqlCommand cmd = new MySqlCommand(insertSQL, myConnection);
 
            cmd.ExecuteNonQuery();
            myConnection.Close();
        }
        int igh = 0;
        int[] igl = new int[1000];
        int ifd=0;
        public void regular_ext(string obr, string strlabel1, string strlabel2, string strlabel3)
        {
 
 
 
 
        }
 
        public static string toTranslit(string str)
        {
            // Таблица для конвертации в транслит
            Dictionary<char, string> t = new Dictionary<char, string>();
            t.Add('а', "a");
            t.Add('б', "b");
            t.Add('в', "v");
            t.Add('г', "g");
            t.Add('д', "d");
            t.Add('е', "e");
            t.Add('ж', "zh");
            t.Add('з', "z");
            t.Add('и', "i");
            t.Add('й', "y");
            t.Add('к', "k");
            t.Add('л', "l");
            t.Add('м', "m");
            t.Add('н', "n");
            t.Add('о', "o");
            t.Add('п', "p");
            t.Add('р', "r");
            t.Add('с', "s");
            t.Add('т', "t");
            t.Add('у', "u");
            t.Add('ф', "f");
            t.Add('х', "h");
            t.Add('ц', "c");
            t.Add('ч', "ch");
            t.Add('ш', "sh");
            t.Add('щ', "shh");
            t.Add('ъ', "");
            t.Add('ы', "i");
            t.Add('ь', "");
            t.Add('э', "e");
            t.Add('ю', "u");
            t.Add('я', "ya");
            string res = "";
            for (int i = 0; i < str.Length; i++)
            {
                bool Прописная = (str[i] >= 'А') && (str[i] <= 'Я');
                bool Строчная = (str[i] >= 'а') && (str[i] <= 'я');
                if (Прописная || Строчная)
                {
                    char lowerCase = str[i].ToString().ToLower()[0];
                    string letter = t[lowerCase];
                    if (Прописная && letter.Length >= 1) letter = letter.Substring(0, 1).ToUpper() + letter.Substring(1);
                    res += letter;
                }
                else res += str[i];
            }
            return res;
        }
        public void CheckAndCreate(string path)
        {
            if (!(Directory.Exists(path)))
            {
                try
                {
                    Directory.CreateDirectory(path);
                }
                catch (Exception error)
                {
                    MessageBox.Show(error.Message);
 
                }
            }
        }
        int helper1=0;
        public Image DownloadImage(string _URL)
        {
        Finish:
        
            if (igh > proxyNum - 1)
            {
                igh = 0;
            }
            if (ifd > 0)
            {
                for (int jh = 0; jh < ifd; jh++)
                {
                    if (igl[jh] == igh)
                    {
                        igh++;
                        goto Finish;
                    }
                }
            }
            Image _tmpImage = null;
 
            try
            {
 
                // Open a connection
                System.Net.HttpWebRequest _HttpWebRequest = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(_URL);
                _HttpWebRequest.Proxy = null;
 
                _HttpWebRequest.AllowWriteStreamBuffering = true;
 
                // You can also specify additional header values like the user agent or the referer: (Optional)
                _HttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
                _HttpWebRequest.Referer = "http://www.google.com/";
                _HttpWebRequest.Proxy = new WebProxy(proxy[igh]);
 
                // set timeout for 20 seconds (Optional)
                _HttpWebRequest.Timeout = 6000;
                helper1++;
                if (helper1 > 10)
                {
                    helper1 = 0;
                    igh++;
                }
                // Request response:
                System.Net.WebResponse _WebResponse = _HttpWebRequest.GetResponse();
 
                // Open data stream:
                System.IO.Stream _WebStream = _WebResponse.GetResponseStream();
 
                // convert webstream to image
                _tmpImage = Image.FromStream(_WebStream);
 
                // Cleanup
                _WebResponse.Close();
                _WebResponse.Close();
            }
            catch 
            {
                //MessageBox.Show("Ошибка прокси в изображении" + igh);
                igl[ifd] = igh;
                ifd++;
                igh++;
                goto Finish;
            }
 
            return _tmpImage;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            string pol = "0";
            System.Threading.Thread processs1 = new System.Threading.Thread(new ThreadStart(delegate()
            {
                poly4ka(pol);
            }));
            processs1.Priority = ThreadPriority.Normal;
 
            processs1.Start();
                     
        }
        string[] strScill = new string[100];
        string[] strlabel1 = new string[100];
        string[] strlabel2 = new string[100];
        string[] strlabel3 = new string[100];
        int[] strObr = new int[100];
        int[] strid = new int[100];
        int ig = 0;
        int[] isp = new int[40];
        public void poly4ka(string potok)
        {
            string Connect = "";            
            for (int ighd = 0; ighd < ig; ighd++)
            {
                if (isp[ighd] == 0)
                {
                    isp[ighd] = 1;
                    polu4alka(strScill[ighd], strlabel1[ighd], strlabel2[ighd], strlabel3[ighd], strObr[ighd], strid[ighd], potok);
                    string insertSQL1 = "update zadanie  set obr ='1' WHERE `id`='" + strid[ighd] + "'";
 
 
                    MySqlConnection myConnection1 = new MySqlConnection(Connect);
 
                    myConnection1.Open();
                    MySqlCommand cmd1 = new MySqlCommand(insertSQL1, myConnection1);
 
                    cmd1.ExecuteNonQuery();
                    myConnection1.Close();
                }
            }
 
           
        }
        private void polu4alka(string urls, string strlabel1, string strlabel2, string strlabel3, int strObr, int strid, string potok)
        {
        
 
                string scil = "<a class=\"p_box_title\" href=\"([htp:/]{7}.*?)\">";
                // Create a request for the URL.
                
                Uri enurii = new Uri(urls);
 
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(urls);
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream ReceiveStream1 = response.GetResponseStream();
                StreamReader sr = new StreamReader(ReceiveStream1, true);
                string html = sr.ReadToEnd();
                Regex strReg = new Regex(scil, RegexOptions.Singleline);
                Match strMatch = strReg.Match(html);
                //Console.WriteLine(responseFromServer);
                int i = 0;
 
                //Progress bar
                // Display the ProgressBar control.
 
                if (Convert.ToInt32(potok) == 0)
                {
                    label6.Visible = true;
                    label6.Text = strlabel3;
                    progressBar1.Visible = true;
                    // Set Minimum to 1 to represent the first file being copied.
                    progressBar1.Minimum = 1;
                    // Set Maximum to the total number of files to copy.
                    progressBar1.Maximum = 56;
                    // Set the initial value of the ProgressBar.
                    progressBar1.Value = 1;
                    // Set the Step property to a value of 1 to represent each file being copied.
                    progressBar1.Step = 1;
                }
                if (Convert.ToInt32(potok) == 1)
                {
                    label7.Visible = true;
                    label7.Text = strlabel3;
                    progressBar2.Visible = true;
                    // Set Minimum to 1 to represent the first file being copied.
                    progressBar2.Minimum = 1;
                    // Set Maximum to the total number of files to copy.
                    progressBar2.Maximum = 56;
                    // Set the initial value of the ProgressBar.
                    progressBar2.Value = 1;
                    // Set the Step property to a value of 1 to represent each file being copied.
                    progressBar2.Step = 1;
                }
                if (Convert.ToInt32(potok) ==2)
                {
                    label8.Visible = true;
                    label8.Text = strlabel3;
                    progressBar2.Visible = true;
                    // Set Minimum to 1 to represent the first file being copied.
                    progressBar3.Minimum = 1;
                    // Set Maximum to the total number of files to copy.
                    progressBar3.Maximum = 56;
                    // Set the initial value of the ProgressBar.
                    progressBar3.Value = 1;
                    // Set the Step property to a value of 1 to represent each file being copied.
                    progressBar3.Step = 1;
                }   
                while (strMatch.Success)
                {
                    i++;
                    regular_ext(strMatch.Groups[1].Value.ToString(), strlabel1, strlabel2, strlabel3);
                    strMatch = strMatch.NextMatch();
                    if (Convert.ToInt32(potok) == 0)
                    {
                        progressBar1.PerformStep();
                    }
                    if (Convert.ToInt32(potok) == 1)
                    {
                        progressBar2.PerformStep();
                    }
                    if (Convert.ToInt32(potok) == 2)
                    {
                        progressBar3.PerformStep();
                    }
                }
 
                // Cleanup the streams and the response.
                
                response.Close();
            
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            string pol = "1";
               System.Threading.Thread processs2 = new System.Threading.Thread(new ThreadStart(delegate()
                {
                   poly4ka(pol);
               }));
               processs2.Priority = ThreadPriority.Normal;
               processs2.Start();
        }
        
        private void button4_Click(object sender, EventArgs e)
        {
            string Connect = "";
            string insertSQL = "";
 
            insertSQL = "SELECT * FROM `zadanie` WHERE `obr`='0' LIMIT 0,40";
 
 
            MySqlConnection myConnection = new MySqlConnection(Connect);
 
            myConnection.Open();
            MySqlCommand cmd = new MySqlCommand(insertSQL, myConnection);
            MySqlDataReader MyDataReader;
            MyDataReader = cmd.ExecuteReader();
            ig = 0;
            while (MyDataReader.Read())
            {
                strScill[ig] = MyDataReader.GetString(1);
                strlabel1[ig] = MyDataReader.GetString(2);
                strlabel2[ig] = MyDataReader.GetString(3);
                strlabel3[ig] = MyDataReader.GetString(4);
                strObr[ig] = MyDataReader.GetInt32(5);
                strid[ig] = MyDataReader.GetInt32(0);
                isp[ig] = 0;
                ig++;
            }
        }
 
        private void button5_Click(object sender, EventArgs e)
        {
            string pol = "2";
            System.Threading.Thread processs3 = new System.Threading.Thread(new ThreadStart(delegate()
            {
                poly4ka(pol);
            }));
            processs3.Priority = ThreadPriority.Normal;
            processs3.Start();
        }
 
        //private void button3_Click(object sender, EventArgs e)
        //{
        //    string pol = "1";
        //    System.Threading.Thread processs1 = new System.Threading.Thread(new ThreadStart(delegate()
        //    {
        //        poly4ka(pol);
        //    }));
 
        //    processs1.Start();      
        //}
 
    }
}
Добавлено через 7 минут
вообще конечно отрисовываю прогресс бары и label из потоков находящихся в другом птоке, мб из-за этого?
0
Эксперт .NET
4430 / 2090 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
20.02.2012, 18:35 12
Цитата Сообщение от gunghost Посмотреть сообщение
вообще конечно отрисовываю прогресс бары и label из потоков находящихся в другом птоке, мб из-за этого?
Скорее всего из-за этого (процентов 99). У тебя что исключения не вылетают из-за обращения к контролам с других потоков?
0
9 / 9 / 2
Регистрация: 06.10.2011
Сообщений: 91
20.02.2012, 18:39  [ТС] 13
Я отключил это=)
C#
1
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
щас буду переделывать=)
после отпишусь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2012, 18:39
Помогаю со студенческими работами здесь

TabControl не отрисовывает рамку валидации пока его вкладка не будет выбрана хотя бы один раз
У TabControl есть проблема, что рамка валидации исчезает, когда происходит переключение между...

Из одного потока запустить другой. Завершение первого не должно сказываться на работе второго
Нужно из основного потока (а) вызвать определенный метод (файловый ввод\вывод, выполняется долго)...

2 потока, один пишет в консоль другой читает с него. Не прокатило
есть консольная программа для работы с пользователем можно ли как-нибудь сделать так чтобы другая...

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru