Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42

Добавить многопоточность

16.06.2015, 13:20. Показов 5758. Ответов 82
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Собрал кое-какой проект (VS 2008, для работы под windows), хочу добавить туда многопоточность, написал кое-что для теста, главный поток отрабатывает нормально:
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
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
 
char ip[14];
char text[256]={};
 
HANDLE logFile;
DWORD WrittenSize;
DWORD dwSize = sizeof(text);
 
void ThreadFunc(fstream &IP)
{
    logFile = CreateFileA("log.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    while (!IP.eof()){
        IP >> ip;
        wsprintfA(text, "%s%s", ip, "\r\n");
        SetFilePointer(logFile, 0, NULL, FILE_END);WriteFile(logFile, text, lstrlenA(text), &WrittenSize, NULL);
    }
}
 
int main()
{   
    fstream IP;
    IP.open("ips.txt");
    ThreadFunc(IP);
    IP.close();
    CloseHandle(logFile);
    system("pause");
}[/CODE][/SPOILER]
 
Пытаюсь запустить ThreadFunc() с помощью CreateThread, делаю примерно так:
[CODE]#include <process.h>
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
 
char ip[14];
char text[256]={};
CRITICAL_SECTION cs, cs1;
 
HANDLE logFile;
DWORD WrittenSize;
DWORD dwSize = sizeof(text);
 
DWORD ThreadId;
HANDLE hThread;
 
DWORD WINAPI ThreadFunc(LPVOID lpParametr)
{
    logFile = CreateFileA("log.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    InitializeCriticalSection (&cs), InitializeCriticalSection (&cs1);
    while (!IP.eof()){
        EnterCriticalSection( &cs );
        IP >> ip;
        LeaveCriticalSection( &cs );
        wsprintfA(text, "%s%s", ip, "\r\n");
        EnterCriticalSection( &cs1 );
        SetFilePointer(logFile, 0, NULL, FILE_END);WriteFile(logFile, text, lstrlenA(text), &WrittenSize, NULL);
        LeaveCriticalSection( &cs1 );
    }
    DeleteCriticalSection (&cs), (&cs1);
}
 
int main()
{   
    fstream IP;
    IP.open("ips.txt");
    hThread = CreateThread(NULL, 0, ThreadFunc, &IP, 0, &ThreadId);
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    //ThreadFunc(IP);// вместо ThreadFunc(IP) вставить createthread
    IP.close();
    CloseHandle(logFile);
    system("pause");
}
Получаю:
error C2065: 'IP' : undeclared identifier
error C2228: left of '.eof' must have class/struct/union

Подозреваю, что не правильно передаю массив строк IP и не могу сообразить, как передать его внутрь потоковой функции, уважаемые, подскажите, как это должно выглядеть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.06.2015, 13:20
Ответы с готовыми решениями:

C++ Многопоточность
Как сделать так, чтобы эта программа заработала? А то она мне вот что пишет: g++ test.cpp -o test -lpthread ./test ...

Многопоточность
Есть программа, суть которой считать с файла, записать в дерево, считать с дерева. Без многопоточности все работает норм. А вот с потоками...

Многопоточность
Столкнулся с проблемой, что не совсем понимаю, что такое многопоточность. С многозадачностью все понятно - несколько процессов выполняются...

82
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
18.06.2015, 23:38  [ТС]
Студворк — интернет-сервис помощи студентам
да, я в курсе, там по-проще завёрнуто, к тому же многие сетуют, что лучше вообще не юзать CreateThread под windows, а лучше брать _beginthreadex, но хочется добить уже API метод

Добавлено через 7 часов 44 минуты
castaway, пока что не совсем понял как передать весь массив, с утречка ещё помучаюсь, ещё такой вопрос,
C++
1
HANDLE * p_hThreads = new HANDLE [num_threads];
не обязательно же так объявлять? если заранее известен размер массива HANDLE
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.06.2015, 11:20
Цитата Сообщение от 163RUSland Посмотреть сообщение
не обязательно же так объявлять? если заранее известен размер массива HANDLE
Не обязательно, просто если размер массива будет слишком большой, то могут возникнуть проблемы с размером стека.
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
19.06.2015, 18:17  [ТС]
castaway, Если я правильно понял, ошибки возникали из-за обращения потоков к массиву строк через fstream, набросал кое-что, думаю ход мысли ясен, так и не понял как передать в функцию потока указатель на массив ips, всё необходимое закомментировал, нужно дать потокам массив ips, чтобы они дёргали строки оттуда, потоков планирую 100-2000 для парсинга.
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
#include "stdafx.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <process.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;
#define THREADS_NUMBER 100
 
char ip[16];
 
CRITICAL_SECTION cs;
 
DWORD WINAPI ThreadFunc(LPVOID lpParametr)
{
    vector * ips = (vector *)lpParametr;// передать указатель на std::vector ips для дальнейшей работы всех потоков с данным массивом
    while( !ips.end() ){// пока не заончатся все строки в массиве std::vector ips
        EnterCriticalSection( &cs );
        *ips >> ip; // передать в переменную ip первую строку массива std::vector ips
        printf( "%s\n", ip );
        LeaveCriticalSection( &cs );}
 
    return 0;
}
 
int main()
{
    std::vector <std::string> ips;
    std::fstream fs_ips;
    fs_ips.open( "ips.txt" );
    while ( !fs_ips.eof() ) {
        char ip2[16];
        fs_ips >> ip2;
        ips.push_back( ip2 );
    }
    fs_ips.close();
 
    HANDLE * p_hThreads = new HANDLE [THREADS_NUMBER];
    InitializeCriticalSection (&cs);
    for( int i = 0; i < THREADS_NUMBER; ++i)
    {
        p_hThreads[i] = CreateThread(NULL, 0, ThreadFunc, &ips, 0, NULL);
    }
    WaitForMultipleObjects( THREADS_NUMBER, p_hThreads, TRUE, INFINITE );
    DeleteCriticalSection (&cs);
    for( int i = 0; i < THREADS_NUMBER; ++i)
    {
        CloseHandle(hThreads[i]);
    }
    system("pause");
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.06.2015, 18:41
C++
1
std::vector<std::string> * ips = (std::vector<std::string> *)lpParametr;
У тебя эти проблемы не закончатся, пока ты не разберёшься с указателями и основами STL. Я вообще не понимаю зачем тебе передавать весь вектор в поток.
1
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
19.06.2015, 18:58  [ТС]
castaway, нужно в поток передать указатель на массив, массив должен быть единым для всех потоков в дальнейшем, а тут массивом является вектор ips же в данном случае? хотя, может я не понял сути вектора. А если ты про
C++
1
while( !ips.end() )
то да, тут надо указатель как-то передать тоже на тот-же массив, а не в каждый поток по разному массиву брать.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.06.2015, 19:04
163RUSland, вектор - это тот же массив, как принять указатель на него в потоке я показал.
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
19.06.2015, 19:05  [ТС]
Но тут я тоже не уверен, может придётся делать как ты предлагал прошлый раз, через for ( ; ; ) если кончился массив, то выходить из цикла
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
21.06.2015, 00:11  [ТС]
castaway, Напилил кое-какого кода, само собой - не рабочего для наглядности
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
#include "stdafx.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <process.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;
#define THREADS_NUMBER 100
 
char ip[16];
 
CRITICAL_SECTION cs;
 
DWORD WINAPI ThreadFunc(LPVOID lpParametr)
{
    EnterCriticalSection( &cs );
    while ( a < ips_count ) {
        
        std::vector<std::string> * ips[a] = (std::vector<std::string> *)lpParametr;
        *ips[a] >> ip;
        printf( "%s\n", ip );
        a++;}
    LeaveCriticalSection( &cs );//}
    // далее работа сокета
    return 0;
}
 
int main()
{   
    std::vector <std::string> ips;
    std::fstream fs_ips;
    fs_ips.open( "ips.txt" );
    while ( !fs_ips.eof() ) {
        char ip2[16];
        fs_ips >> ip2;
        ips.push_back( ip2 );
    }
    fs_ips.close();
    
    size_t ips_count = ips.size();
    int a = 0;
    
    HANDLE * p_hThreads = new HANDLE [THREADS_NUMBER];
    InitializeCriticalSection (&cs);
    for( int i = 0; i < THREADS_NUMBER; ++i)
    {
        p_hThreads[i] = CreateThread(NULL, 0, ThreadFunc, *ips, 0, NULL);
    }
    WaitForMultipleObjects( THREADS_NUMBER, p_hThreads, TRUE, INFINITE );
    ips.clear();
    DeleteCriticalSection (&cs);
    for( int i = 0; i < THREADS_NUMBER; ++i)
    {
        CloseHandle(p_hThreads[i]);
    }
    system("pause");
}
появились новые вопросы, как передать несколько аргументов в поток
(int a, size_t ips_count + указатель на ips), есть ещё подозрение, что можно обойтись без передачи размера массива и счетчика переданных строк лишь передачей указателя на ips и вместо бесконечного for сделать что-то типа while ( ! *ips.end() )
потоки должны брать с единого массива строки поочередно.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.06.2015, 07:53
Цитата Сообщение от 163RUSland Посмотреть сообщение
появились новые вопросы, как передать несколько аргументов в поток
Для этого проще всего использовать структуру, и указатель на неё.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct MyStruct {
    int a;
    size_t ips_count;
    ips;
};
 
...
 
MyStruct ms;
 
...
DWORD WINAPI ThreadFunc(LPVOID lpParametr)
{
    MyStruct * p_ms = (MyStruct *)lpParametr;
    ...
}
...
p_hThreads[i] = CreateThread(NULL, 0, ThreadFunc, &ms, 0, NULL);
...
Ну и конечно заполнить саму структуру там где это необходимо (до создания потока).
C++
1
2
3
ms.a = ...;
ms.ips_count = ...;
ms.ips = ...;
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
21.06.2015, 10:44  [ТС]
castaway, собрал
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
#include "stdafx.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <process.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;
#define THREADS_NUMBER 1
 
char ip[16];
int a = 0;
struct MyStruct {
    size_t ips_count;
    vector <string> ips;};
 
CRITICAL_SECTION cs;
 
DWORD WINAPI ThreadFunc(LPVOID lpParametr){
 
    MyStruct * p_ms = (MyStruct *)lpParametr;
 
    for ( ; ; ){
        EnterCriticalSection( &cs );
        if ( a < (p_ms->ips_count) ) {
            p_ms->ips[a] = ip;
            printf( "%s\n", ip );
            a++;
        } else break;
        LeaveCriticalSection( &cs );
        // далее работа сокета
    }
    
    return 0;
}
 
int main()
{   
    std::vector <std::string> ips;
    std::fstream fs_ips;
    fs_ips.open( "ips.txt" );
    while ( !fs_ips.eof() ) {
        char ip2[16];
        fs_ips >> ip2;
        ips.push_back( ip2 );
    }
    fs_ips.close();
 
    MyStruct ms;
    ms.ips_count = ips.size();
 
    HANDLE * p_hThreads = new HANDLE [THREADS_NUMBER];
    InitializeCriticalSection (&cs);
    for( int i = 0; i < THREADS_NUMBER; ++i)
    {
        p_hThreads[i] = CreateThread(NULL, 0, ThreadFunc, &ms, 0, NULL);
    }
    WaitForMultipleObjects( THREADS_NUMBER, p_hThreads, TRUE, INFINITE );
    ips.clear();
    DeleteCriticalSection (&cs);
    for( int i = 0; i < THREADS_NUMBER; ++i)
    {
        CloseHandle(p_hThreads[i]);
    }
    system("pause");
}
компилируется, но вылетает на старте даже в 1 поток. Есть еще вопрос касаемо размера исполняемого файла, увеличился в разы, это не из-за того, что в каждый поток передаётся структура в которой весь массив ips? указатель как-то можно передать внутри структуры? и как тогда ссылаться по указателю на указатель.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.06.2015, 11:09
Цитата Сообщение от 163RUSland Посмотреть сообщение
Есть еще вопрос касаемо размера исполняемого файла, увеличился в разы, это не из-за того, что в каждый поток передаётся структура в которой весь массив ips?
Нет, не из-за этого. В разы - это сколько?

Цитата Сообщение от 163RUSland Посмотреть сообщение
указатель как-то можно передать внутри структуры? и как тогда ссылаться по указателю на указатель.
Можно. На такие простые вопросы пора бы самому отвечать.

C++
1
2
3
4
5
6
7
8
9
struct A {
    int * p;
};
 
A a;
a.p = ...;
 
A * b = new A;
b->p = ...;
По поводу твоего кода. Ты не заполнил поле ips в структуре, и лучше его сделать указателем, иначе для каждого потока будет создаваться копия вектора.
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
21.06.2015, 11:54  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Нет, не из-за этого. В разы - это сколько?
в 9-10 раз, был 16 КБ
Цитата Сообщение от castaway Посмотреть сообщение
Ты не заполнил поле ips в структуре
так?
C++
1
2
3
    MyStruct ms;
    ms.ips_count = ips.size();
    ms.ips = ips;
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.06.2015, 12:20
Цитата Сообщение от 163RUSland Посмотреть сообщение
в 9-10 раз, был 16 КБ
160КБ это нормально для программы. Обычно это случается после подключения заголовочного файла iostream или ему подобных.

Цитата Сообщение от 163RUSland Посмотреть сообщение
так?
Так. Только используй указатель.
C++
1
2
3
4
5
6
7
8
struct MyStruct {
    size_t ips_count;
    vector <string> * ips;
};
 
...
 
ms.ips = &ips;
1
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
21.06.2015, 12:39  [ТС]
castaway,
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <process.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
using namespace std;
#define THREADS_NUMBER 1
 
char ip[16];
int a = 0;
struct MyStruct {
    size_t ips_count;
    vector <string> *ips;};
 
CRITICAL_SECTION cs;
 
DWORD WINAPI ThreadFunc(LPVOID lpParametr){
 
    MyStruct * p_ms = (MyStruct *)lpParametr;
 
    for ( ; ; ){
        EnterCriticalSection( &cs );
        if ( a < (p_ms->ips_count) ) {
            p_ms->ips[a] = ip;
            printf( "%s\n", ip );
            a++;
        } else break;
        LeaveCriticalSection( &cs );
        // далее работа сокета
    }
    
    return 0;
}
 
int main()
{   
    std::vector <std::string> ips;
    std::fstream fs_ips;
    fs_ips.open( "ips.txt" );
    while ( !fs_ips.eof() ) {
        char ip2[16];
        fs_ips >> ip2;
        ips.push_back( ip2 );
    }
    fs_ips.close();
 
    MyStruct ms;
    ms.ips_count = ips.size();
    ms.ips = &ips;
 
    HANDLE * p_hThreads = new HANDLE [THREADS_NUMBER];
    InitializeCriticalSection (&cs);
    for( int i = 0; i < THREADS_NUMBER; ++i)
    {
        p_hThreads[i] = CreateThread(NULL, 0, ThreadFunc, &ms, 0, NULL);
    }
    WaitForMultipleObjects( THREADS_NUMBER, p_hThreads, TRUE, INFINITE );
    ips.clear();
    DeleteCriticalSection (&cs);
    for( int i = 0; i < THREADS_NUMBER; ++i)
    {
        CloseHandle(p_hThreads[i]);
    }
    system("pause");
}
не понятно теперь как передать в ip очередную строку из массива
C++
1
p_ms->ips[a] = ip;
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'char [16]' (or there is no acceptable conversion)
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.06.2015, 12:48
C++
1
p_ms->ips[a] = &ip[0];
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
21.06.2015, 13:08  [ТС]
castaway, меняю на твою строку, та же ошибка(
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.06.2015, 13:24
Всё верно. Это я недосмотрел.
C++
1
(*p_ms->ips)[a] = ip;
1
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
21.06.2015, 13:38  [ТС]
castaway, выводит пустые строки, кол-во пустых строк соответствует кол-ву строк в файле, тоже самое наблюдал, когда делал тест в 1 поток с передачей всего массива без указателя
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
21.06.2015, 13:43
А ты как хотел. У тебя глобальный массив ip нигде не заполняется.
0
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 42
21.06.2015, 13:56  [ТС]
castaway, я пробовал его объявлять как string ip, получается, что в строке(*p_ms->ips)[a] = ip;
слева и справа от "=" переменные одного типа string и происходит присваивание переменной ip очередной строки массива ips или я ошибаюсь? Если всё верно, не могу понять что ещё нужно заполнить...

Добавлено через 6 минут
мой косяк, сделал ip как string и заработало, не правильно присваивал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.06.2015, 13:56

Многопоточность
Здравствуйте! Прошу помочь реализовать многопоточность. Написал брут, когда запускаю в 1 поток, всё идёт ок, как запускаю в 2 и более всё...

Многопоточность
Если не ошибаюсь, данная вещь, которая описана ниже, называется многопоточностью. Чтобы в полной мере шарить в java надо затратить...

многопоточность в Qt
над qt первый день копчу, гуру подскажите как многопоточность здесь реализуется, omp или boost не подключаются?

многопоточность
Привет подскажите возможно ли отслеживать проникновение посторонних программ через много поточность?

Многопоточность
Вообщем есть код 1 потока - логин в аккаунт, но мне нужно сделать чтобы было сразу несколько потоков и проверялись несколько аккаунтов за...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru