Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Зависает при многопоточности / 23 сообщений из 23, страница 1 из 1
05.05.2014, 11:15
    #38632922
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
Доброе время суток.Помогите советом, несколько дней бьюсь, все перепробовал. Никак не могу разобраться в чем проблема, есть dll, которая забирает данные с устройств по TCPIP при однопоточности все норм, а при использовании многопоточности все зависает, а иногда и проскакивает и к тому же не все потоки отрабатывают... В чем может быть причина?
Код не сложный:
Код: 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.
 class Program
    {
        public static int Main(string[] args)
        {

            BBB c1 = new BBB();
            BBB c2 = new BBB();
            BBB c3 = new BBB();
            BBB c4 = new BBB();
            BBB c5 = new BBB();
            Parallel.Invoke(c1.W, c2.W, c3.W, c4.W, c5.W);

            Console.ReadKey();
            return 0;
        }
        class BBB
        {
            libnodave.daveOSserialType fds;
            libnodave.daveInterface di;
            libnodave.daveConnection Connect;
            private Object thisLock = new Object();
           public BBB()
           {
               Console.WriteLine("Сокет {0}", Task.CurrentId);
               fds.rfd = libnodave.openSocket(102, "192.168.4.115");
               fds.wfd = fds.rfd;
               if (fds.rfd > 0)
               {
                   di = new libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k);
                   di.setTimeout(1000);
                   Connect = new libnodave.daveConnection(di, 0, 0, 2);
                   Connect.connectPLC();
               }
               else
                   Console.WriteLine("Ошибка в потоке {0}", Task.CurrentId);
           }
            public void W()
            {
                    for (int y = 0; y < 1;y++ )
                    {
                        using (libnodave.PDU p = Connect.prepareReadRequest())
                        {
                            p.addVarToReadRequest(libnodave.daveDB, 102, 2, 3);
                            p.addVarToReadRequest(libnodave.daveDB, 102, 6, 3);
                            using (libnodave.resultSet rl = new libnodave.resultSet())
                            {
                                    Connect.execReadRequest(p, rl);
                                    for (int x = 0; x < 19; x++)
                                    {
                                        if (Connect.useResult(rl, x) == 0)
                                        {
                                            Console.WriteLine("Значение{0}|{1}:{2}|{3}|{4}", 1, x + 1, Connect.getFloat(), DateTime.Now.ToString("mm:ss.fff"), Task.CurrentId);
                                        }
                                        else
                                            Console.WriteLine("Error");
                                    }
                                 
                                
                            }
                        }
                    }
                
            }
        }
    }
...
Рейтинг: 0 / 0
05.05.2014, 11:17
    #38632928
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
Как понял, зависает при вызове функции Connect.execReadRequest(p, rl);
...
Рейтинг: 0 / 0
05.05.2014, 11:49
    #38632988
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
ldar,
авторпри однопоточности все норм, а при использовании многопоточности
не понял, при какой много поточности? на ой стороне, при передаче, или многопоточность на приеме?
...
Рейтинг: 0 / 0
05.05.2014, 11:57
    #38633005
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
Где-то в степи, при приеме. Мной используемая dll опрашивает удаленные контроллеры по TCPIP.
При опросе в один поток, все нормально, но медленно, решил сделать многопоточность, зависает.
...
Рейтинг: 0 / 0
05.05.2014, 11:59
    #38633009
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
Еще, если к примеру сделать 2 потока, то отрабатывает, 3 потока отрабатывает чаще, а если больше 4х зависает.
...
Рейтинг: 0 / 0
05.05.2014, 12:03
    #38633017
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
ldar,
кто вам посоветовал эту реализацию - убейте ( или друга или мозг)
...
Рейтинг: 0 / 0
05.05.2014, 12:12
    #38633029
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
Где-то в степи, убиваю свой мозг.
А в чем собственно ошибка, я новичок...
...
Рейтинг: 0 / 0
05.05.2014, 12:16
    #38633031
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
ldar,

если на приём идёт один поток данных на один порт, то и принимать его можно только в один поток.

Зависает, я думаю, по классической причине гонки: один поток начинает чтение данных, потом другой поток дочитывает эти данные, а первому уже не остаётся, но он продолжает ждать их.
...
Рейтинг: 0 / 0
05.05.2014, 12:20
    #38633037
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
petalvik,
На немецком форуме обсуждающие эту библиотеку пишут, что используют в многопоточности до 50 потоков. Но увы не приводят примеры, а я не знаю немецкого чтоб правильно задать им вопрос)...
...
Рейтинг: 0 / 0
05.05.2014, 12:23
    #38633042
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
ldar,
сокет -> Слушатель ( ваша длл)->(ложим задание)потоконезависимая очередь -> пул потоков, которые берут задания из очереди
...
Рейтинг: 0 / 0
05.05.2014, 12:28
    #38633051
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
ldarpetalvik,
На немецком форуме обсуждающие эту библиотеку пишут, что используют в многопоточности до 50 потоков. Но увы не приводят примеры, а я не знаю немецкого чтоб правильно задать им вопрос)...
скорее всего не разобрались с библиотекой, а ломитесь с какого то банального копипаста..
...
Рейтинг: 0 / 0
05.05.2014, 12:32
    #38633058
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
Где-то в степиldar,
сокет -> Слушатель ( ваша длл)->(ложим задание)потоконезависимая очередь -> пул потоков, которые берут задания из очереди
А где про это можно почитать?
...
Рейтинг: 0 / 0
05.05.2014, 12:39
    #38633071
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
Где-то в степиldarpetalvik,
На немецком форуме обсуждающие эту библиотеку пишут, что используют в многопоточности до 50 потоков. Но увы не приводят примеры, а я не знаю немецкого чтоб правильно задать им вопрос)...
скорее всего не разобрались с библиотекой, а ломитесь с какого то банального копипаста..
В мануале по dll кроме простенького примера ничего нет, да все функции которые есть, они все в примеру участвуют который я привел.
Как я понял из немецкого форума, они на каждый поток создают свое соединение.
...
Рейтинг: 0 / 0
05.05.2014, 12:39
    #38633072
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
ldar,авторА где про это можно почитать?
вы как то обескуражили меня, чет тут читать, сел и пиши..
а лучше разберитесь с библиотекой, если она промышленная, то там асинхронность уже вшита ( имхо)
(немцы они не только потрахаться..)
дайте ссылку на нее, может кто и посмотрит.
...
Рейтинг: 0 / 0
05.05.2014, 12:42
    #38633080
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
...
Рейтинг: 0 / 0
05.05.2014, 13:12
    #38633132
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
ldar,
само ядро написано на с++, а libnodave.net.dll просто обертка.
что там на форуме подразумевал товарищ-ганс под многопоточностью, скорее в разных потоках слушать разные порты
но не один, однозначно..
ток что делайте обертку над этой либой, или тупо, как я предложил
...
Рейтинг: 0 / 0
05.05.2014, 13:15
    #38633138
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
По libnodave доуха обсуждений и примеров на аглицком... нет ни какого смысла дрючить контроллер в 100 потоков... один поток на контроллер на чтение один на обработку, если нужно...
...
Рейтинг: 0 / 0
05.05.2014, 13:24
    #38633156
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
Где-то в степи,
извиняюсь за глупый вопрос, а зачем делать обертку если она имеется.
А не может быть проблема, в том, что я использую одну обертку для всех потоков, просто в этой обертке используется указатель.
...
Рейтинг: 0 / 0
05.05.2014, 13:45
    #38633201
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
buser,
За один запрос можно вытащить 220 Байт, для меня это мало, мне нужно около 7000. За один запрос уходит 150 мс это время выполнение функции execReadRequest(p, rl); , при цикличном опросе занимает больше 10 секунд, дискретность получается высокой.
Может что то надо настроить, почему может быть так много 150 мс.
...
Рейтинг: 0 / 0
06.05.2014, 01:37
    #38633947
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
ldar,
пробежался по гуглу, уже сделали обертку DotNetSiemensPLCToolBoxLibrary, не пробовали?
я могу ошибаться, мельком взглянул доки, размер получаемого запроса можно регулировать.
...
Рейтинг: 0 / 0
06.05.2014, 06:09
    #38633996
ldar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
Где-то в степи, спасибо за активную помощь мне, я смотрел эту библиотеку, там все равно за один запрос больше 220 байт не вытащишь, т.к. это ограничение устройства с которого тяну данные...Как то же вытаскивают данные другие люди, пока это покрыто тайной...
...
Рейтинг: 0 / 0
17.07.2014, 09:20
    #38698581
mikola1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
ldar,

удалось решить проблему?
столкнулся с подобной бедой, и не знаю что делать...
...
Рейтинг: 0 / 0
31.07.2014, 11:54
    #38709857
mikola1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зависает при многопоточности
Автор темы пропал.
В общем во много потоков работает если к одному и тому же сокету нет обращений из нескольких потоков...
в общем смотрите что и как и откуда у вас вызывается....
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Зависает при многопоточности / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]