Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: Последовательность в многопоточности Добавлено: 29.08.10 13:11  

Автор вопроса:  Nevep

Ответить

  Ответы Всего ответов: 36  

Номер ответа: 16
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #16 Добавлено: 30.08.10 23:10
Если весь класс обвешен критическими секциями, разумеется, никаких исключений ты не получишь, откуда?

Ответить

Номер ответа: 17
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #17 Добавлено: 30.08.10 23:18
EROS пишет:
а потокобезопасный в том плане что мы никогда не получим Cross-Thread Excepthion или, что чаще всего бывает с другими коллекциями, Collection was modified

При чем здесь Cross-Thread Exception? Он относится в Windows Forms а не к этим структурам.
Collection was modified не падает, но падают другие - System.IndexOutOfRangeException и System.ArgumentException, абсолютно неинформативные, но по той же причине - коллекция была модифицирована.

Если класс потокобезопасный, то с ним можно работать без использования критических секций, это, собственно, и есть суть потокобезопасности. Если, чтоб класс заработал, приходится обвешивать его критическими секциями везде где можно, то он уже никакой не потокобезопасный.

Ответить

Номер ответа: 18
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #18 Добавлено: 30.08.10 23:59
ты ваще к чему всю эту байду тут развел? Чисто попонтоваться или тупо пацану FW 4.0 втюхать?

Ответить

Номер ответа: 19
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #19 Добавлено: 31.08.10 00:47
Нет, просто заметил что в интернете кто-то не прав

Ответить

Номер ответа: 20
Автор ответа:
 Nevep



Вопросов: 6
Ответов: 25
 Профиль | | #20 Добавлено: 01.10.10 00:39
EROS, Artyom спасибо за подробное описание... Вроде бы разобрался с потоками, теперь запускаются последовательно, BlockingCollection не применял. Вопрос по функции, запускается допустим 10 потоков (10 ссылок в массиве links), в каждом потоке переменной main(param) присваивается возвращённое функцией значение fnc(param). Проблема в том что значение переменной main(param) присваивается через раз...
  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         '  links-массив ссылок
  3.         _pool = New Semaphore(0, links.Length)
  4.         _pool.Release(links.Length)
  5.         Dim g
  6.         For g = 0 To links.Length - 1    
  7.             ReDim Preserve main(g + 1)
  8.             ReDim Preserve htmlmain(g + 1)
  9.             t = New Thread(New ParameterizedThreadStart(AddressOf stt))
  10.             t.Start(g)
  11.         Next
  12.         'запускаем столько потоков сколько ссылок в массиве links
  13.     End Sub
  14.  
  15.      Private Sub stt(ByVal param)
  16.         _pool.WaitOne()
  17.         Try
  18.             main(param) = fnc(param)      
  19.             log(param & "log.txt", main(param))    
  20.         Catch ex As Exception        
  21.         End Try
  22.         _pool.Release()
  23.     End Sub
  24.  
  25.      Function fnc(ByVal param)
  26.       'функция получения хтмл кода страниц
  27. Try
  28.         Dim request As HttpWebRequest
  29.         Dim response As HttpWebResponse
  30.         Dim reader As StreamReader
  31.  
  32.         request = WebRequest.Create(links(param))
  33.         request.Method = "GET"
  34.         request.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)"
  35.         request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
  36.         response = request.GetResponse()
  37.         reader = New StreamReader(response.GetResponseStream())
  38.         htmlmain(param) = reader.ReadToEnd
  39.         response.Close()
  40.         'MsgBox(param)
  41. Catch ex As Exception
  42.             MsgBox(123)
  43.         End Try
  44.         Return (param)
  45.     End Function
  46.  
  47.      Function log(ByVal putt, ByVal textanama)
  48.         Dim fFile As Short
  49.         fFile = FreeFile()
  50.         FileOpen(fFile, putt, OpenMode.Append)
  51.         PrintLine(fFile, textanama)
  52.         FileClose(fFile)
  53.     End Function

Ответить

Номер ответа: 21
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #21 Добавлено: 01.10.10 12:44
переменной main(param) присваивается возвращённое функцией значение fnc(param)

  1.  
  2. ...
  3. main(param) = fnc(param)
  4. ...
  5.  
  6. Function fnc(ByVal param)
  7. ...
  8.    Return (param)
  9. End Function



Тебе не кажется, что это полная чушь?

Ответить

Номер ответа: 22
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #22 Добавлено: 01.10.10 13:57
nevep, ни какого понятия о потокобезопасности (не говоря о типизации)

Во-первых, main и htmlmain должны быть проинициализированы до начала цикла
Во-вторых, в VB в массивах указывается не размер массива, а верхняя граница, т.е. вместо g+1 нужно просто g (в отличие от C#)
В-третьих, зачем нужен Semaphore, если ты его инициализируешь кол-вом потоков? Он в данном случае абсолютно бесполезен
В-четвертых, в методе log должна быть синхронизация, чтоб несколько потоков не могли одновременно модифицировать файл.
В-пятых, HttpWebResponse, StreamReader реализуют IDisposable и должны использоваться в блоках using для своевременного освобождения подключений
В-шестых, по умолчанию HttpWebRequest может выполнять не более 2 одновременных запросов к одному и тому же серверу, поэтому если у тебя запросы идут к одному серверу, то у тебя одновременно будет скачивать инфу только 2 потока, остальные ждать в очереди.

Ответить

Номер ответа: 23
Автор ответа:
 Nevep



Вопросов: 6
Ответов: 25
 Профиль | | #23 Добавлено: 01.10.10 19:45
Тебе не кажется, что это полная чушь?

на самом деле fnc(param) возвращает htmlmain(param)
Во-первых, main и htmlmain должны быть проинициализированы до начала цикла

добавил Dim main, htmlmain
В-третьих, зачем нужен Semaphore, если ты его инициализируешь кол-вом потоков? Он в данном случае абсолютно бесполезен

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

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

Запросы идут к разным серверам

  ;Dim main, htmlmain
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
         ' links-массив ссылок
         ;Dim g
         For g = 0 To links.Length - 1
             ReDim Preserve main(g)
             ReDim Preserve htmlmain(g)
             t = New Thread(New ParameterizedThreadStart(AddressOf stt))
             t.Start(g)
         Next
         'запускаем столько потоков сколько ссылок в массиве links
     End Sub
  
      Private Sub stt(ByVal param)
         Try
'Присваиваем элементу массива хтмл код страницы
             main(param) = fnc(param)
             log(param & "log.txt", main(param))
         Catch ex As Exception
         End Try
     End Sub
  
      Function fnc(ByVal param)
       'функция получения хтмл кода страниц
 Try
         ;Dim request As HttpWebRequest
         ;Dim response As HttpWebResponse
         ;Dim reader As StreamReader
  
         request = WebRequest.Create(links(param))
         request.Method = "GET"
         request.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)"
         request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
         response = request.GetResponse()
         reader = New StreamReader(response.GetResponseStream())
         htmlmain(param) = reader.ReadToEnd
         response.Close()
         'MsgBox(param)
 Catch ex As Exception
             MsgBox(123)
         End Try
         Return (htmlmain(param))
     End Function
  
      Function log(ByVal putt, ByVal textanama)
         ;Dim fFile As Short
         fFile = FreeFile()
         FileOpen(fFile, putt, OpenMode.Append)
         PrintLine(fFile, textanama)
         FileClose(fFile)
     End Function

Проблема осталась, это из-за IDisposable?

Ответить

Номер ответа: 24
Автор ответа:
 Nevep



Вопросов: 6
Ответов: 25
 Профиль | | #24 Добавлено: 01.10.10 19:46
упс...забыл код в тег
  1. Dim main, htmlmain
  2.   Private  Sub Button1_Click(ByVal  sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  3.          '  links-массив ссылок      
  4.          Dim g
  5.          For g = 0 To links.Length - 1    
  6.              ReDim Preserve main(g)
  7.              ReDim Preserve htmlmain(g)
  8.              t = New Thread(New ParameterizedThreadStart(AddressOf stt))
  9.              t.Start(g)
  10.          Next
  11.          'запускаем столько потоков сколько ссылок в массиве links
  12.      End Sub
  13.   
  14.       Private Sub stt(ByVal param)
  15.          Try
  16.      'Присваиваем элементу массива хтмл код страницы
  17.              main(param) = fnc(param)      
  18.              log(param & "log.txt", main(param))    
  19.          Catch ex As Exception        
  20.          End Try
  21.      End Sub
  22.   
  23.       Function fnc(ByVal param)
  24.        'функция получения хтмл кода страниц
  25.  Try
  26.          Dim request As HttpWebRequest
  27.          Dim response As HttpWebResponse
  28.          Dim reader As StreamReader
  29.   
  30.          request = WebRequest.Create(links(param))
  31.          request.Method = "GET"
  32.          request.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows 95; MSIECrawler)"
  33.          request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
  34.          response = request.GetResponse()
  35.          reader = New StreamReader(response.GetResponseStream())
  36.          htmlmain(param) = reader.ReadToEnd
  37.          response.Close()
  38.          'MsgBox(param)
  39.  Catch ex As Exception
  40.              MsgBox(123)
  41.          End Try
  42.          Return (htmlmain(param))
  43.      End Function
  44.   
  45.       Function log(ByVal putt, ByVal textanama)
  46.          Dim fFile As Short
  47.          fFile = FreeFile()
  48.          FileOpen(fFile, putt, OpenMode.Append)
  49.          PrintLine(fFile, textanama)
  50.          FileClose(fFile)
  51.      End Function

Ответить

Номер ответа: 25
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #25 Добавлено: 01.10.10 22:37
Nevep, перед этим было 10 лет упорных тренировок на VB6, угадал?

Ответить

Номер ответа: 26
Автор ответа:
 Nevep



Вопросов: 6
Ответов: 25
 Профиль | | #26 Добавлено: 01.10.10 22:49
угу, только не 10 :) ... просто не понимаю как решить эту проблему :(

Ответить

Номер ответа: 27
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #27 Добавлено: 01.10.10 22:49
Под какую версию .NET Framework пишешь?

Ответить

Номер ответа: 28
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #28 Добавлено: 01.10.10 22:50

Во-первых, main и htmlmain должны быть проинициализированы до начала цикла
Во-вторых, в VB в массивах указывается не размер массива, а верхняя граница, т.е. вместо g+1 нужно просто g (в отличие от C#)
В-третьих, зачем нужен Semaphore, если ты его инициализируешь кол-вом потоков? Он в данном случае абсолютно бесполезен
В-четвертых, в методе log должна быть синхронизация, чтоб несколько потоков не могли одновременно модифицировать файл.
В-пятых, HttpWebResponse, StreamReader реализуют IDisposable и должны использоваться в блоках using для своевременного освобождения подключений
В-шестых, по умолчанию HttpWebRequest может выполнять не более 2 одновременных запросов к одному и тому же серверу, поэтому если у тебя запросы идут к одному серверу, то у тебя одновременно будет скачивать инфу только 2 потока, остальные ждать в очереди.


Какие из этих рекомендаций ты принял к сведению и воплотил в коде?

Ответить

Номер ответа: 29
Автор ответа:
 Nevep



Вопросов: 6
Ответов: 25
 Профиль | | #29 Добавлено: 01.10.10 22:51
Да под любую, это не принципиально, главное чтоб работало... стоят на мой взгляд все самые необходимые
v1.0.3705\
v1.1.4322\
v2.0.50727\
v3.0\
v3.5\
v4.0.30319\

Ответить

Номер ответа: 30
Автор ответа:
 Nevep



Вопросов: 6
Ответов: 25
 Профиль | | #30 Добавлено: 01.10.10 23:01
Какие из этих рекомендаций ты принял к сведению и воплотил в коде?

все, кроме 1 и 5. сейчас сделал так:
  1. ReDim Preserve lnk(links.Length - 1)
  2.         ReDim Preserve uagent(links.Length - 1)
  3.         ReDim Preserve main(links.Length - 1)
  4.         ReDim Preserve htmlmain(links.Length - 1)
  5.       
  6.         Dim g
  7.         For g = 0 To links.Length - 1
  8.             'ReDim Preserve lnk(g)
  9.             'ReDim Preserve uagent(g)
  10.             'ReDim Preserve main(g)
  11.             'ReDim Preserve htmlmain(g)
  12.             t = New Thread(New ParameterizedThreadStart(AddressOf startspam))
  13.             t.Start(g)
  14.         Next

Вроде теперь работает.
Я так понел... что нельзя делать ReDim Preserve массива, когда поток может забирать данные из этого массива. я правильно понял?

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам