С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
.NET 4.x

Прервать несколько потоков

04.05.2015, 08:48. Показов 3242. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток уважаемые!

Подскажите пожалуйста, как правильно решить следующую задачу: выполнить некоторый метод в разных, не зависимых друг от друга потоках. Потом при необходимости, в какой-то момент времени эти потоки максимально быстро прервать/убить (и вынести их трупы куда-нибудь подальше ), потом, в какой-то момент времени запустить новые потоки... и т.д.

Интересует максимально простой пример, по возможности с комментариями. Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.05.2015, 08:48
Ответы с готовыми решениями:

Несколько асинхронных потоков
Здравствуйте. listener.BeginAcceptTcpClient( new AsyncCallback(ListnerPort), ...

Функция в несколько потоков
Здравствуйте! У меня есть функция. Но как бы я ее не оптимизировал скорости прибавления не много. Хотелось бы чтобы эта функция...

Разбить цикл на несколько потоков
Добрый день! Есть известный int N=10000, необходимо создать несколько потоков с циклами (for int x=0; x<N;x++) { ...

19
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.05.2015, 08:58
Цитата Сообщение от wolfalone Посмотреть сообщение
потоки максимально быстро прервать/убить
В методе-цели потоков предусмотрите флаг для выхода из метода.
Цитата Сообщение от wolfalone Посмотреть сообщение
и вынести их трупы куда-нибудь подальше
CLR сделает это за вас.
0
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
04.05.2015, 09:04  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
В методе-цели потоков предусмотрите флаг для выхода из метода.
С этим может быть некоторая проблема, так как:
1. В методе может выполняться сторонний, независимый код, загруженный из какой-то "левой" сборки
2. В какой-то момент, метод может просто "зависнуть" на какой-то операции (в т.ч. это может быть напрямую связано с п.1)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.05.2015, 09:09
wolfalone, сборка управляемая? Ее код доступен?
Можно сделать определенный таймаут, за который код внутри метода должен завершиться. Если нет - то выход из метода.
В любом случае, вызова Abort() для потока нужно избегать. Это плохая практика.
0
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
04.05.2015, 09:46  [ТС]
insite2012, вопрос носит скорее риторический характер, нежели иллюстрирует какой-то конечный (строго определённый) пример. Но, давайте, для примера, предположим, что мы загрузили некоторую сбоку, с управляемым кодом, исходника которой у нас нет и не может быть в принципе, т.к. она загружается из сети.

У этой сборки есть некоторый метод, выполнение которого выглядит примерно так:
C#
1
MyAmazingAssemby.DoSomethingWork("Hello world!");
И таких вызовов, мне нужно, например 10шт. одновременно выполнить, параллельно. Потом наступает некоторая "точка не возврата", когда мне нужно прервать выполнение всех 10-и потоков, сделать что-то ещё и запустить другие 10...

Давайте попробую привести какой-то более жизненный пример... Где-то в анналах сети, лежит периодически обновляемая сборка, за обновление которой отвечает сторонний не известный мне разработчик. Я загружаю эту сборку, основной задачей которой является, парсинг веб-страниц (очень большого их количества), с множеством данных... Процесс занимает достаточно продолжительное время, но, при этом есть высокая вероятность, что сайт с которого мы собираем информацию - в какой-то момент времени перестанет работать, отдавать страницы или с ним произойдёт ещё что-то "нехорошее"... За мониторинг сайта, отвечает работающий в отдельном потоке "монитор", и вот от монитора пришла информация, что сайт "того" (отвалился). Что бы не терять времени, нам нужно начинать обрабатывать собранные данные, до тех пор пока от "монитора" снова не придёт сообщение, что сайт снова доступен и можно продолжать его парсинг (загрузку страниц с него)... При этом, обработчик запускает тоже в 10-и, т.к. нагрузка одного процесса-обработчика на процессор минимальная, а нам нужно использовать ресурсы машины по максимуму. Соответственно, когда от "монитора" пришло сообщение, что сайт снова доступен - мы прерываем процессы-обработчики (загруженные так же, из "сетевой" сборки) и запускаем процессы-сборщики.

Что хранится в сборках, которые мы загружаем и как именно они там работают, мне не известно (по условиям задачи). Я имею в виду, внутренний алгоритм их работы.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.05.2015, 09:56
wolfalone, чудится мне, что вопрос вы поставили немного не так. Итак, по порядку.
Цитата Сообщение от wolfalone Посмотреть сообщение
сайт с которого мы собираем информацию - в какой-то момент времени перестанет работать, отдавать страницы или с ним произойдёт ещё что-то "нехорошее"
1. Как видите, вы имеете возможность получить информацию о том, что произошло что-то не хорошее. Чем вам это не точка для того, чтобы выйти из метода по к-либо критерию?
Цитата Сообщение от wolfalone Посмотреть сообщение
Что бы не терять времени, нам нужно начинать обрабатывать собранные данные, до тех пор пока от "монитора" снова не придёт сообщение, что сайт снова доступен и можно продолжать его парсинг (загрузку страниц с него)
2. Простой многопотоковый алгоритм, реализуется через конструкции синхронизации (типа EventWaitHandle и так далее, но этот особенно удобен).
Цитата Сообщение от wolfalone Посмотреть сообщение
когда от "монитора" пришло сообщение, что сайт снова доступен - мы прерываем процессы-обработчики (загруженные так же, из "сетевой" сборки) и запускаем процессы-сборщики.
3. И последнее. Не вижу смысла прерывать и запускать потоки. Гораздо проще сделать несколько (предположим 10) потоков-мониторов сайтов, и столько же потоков для обработки. Для их синхронизма использовать конструкции, указанные в п.п.2

Добавлено через 2 минуты
P.S. Сделать вам к-либо конкретный пример у меня нет возможности, поскольку логики работы того кода, который вы намереваетесь использовать я не знаю, и самих адресов сайтов тоже. Поэтому только высказал общий принцип.
0
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
04.05.2015, 10:06  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Чем вам это не точка для того, чтобы выйти из метода по к-либо критерию?
Не совсем понимаю, как я могу выйти из "чужого" метода по своему критерию?

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

1. Есть пользователь (иллюстрирует мою программу), который работает за компьютером
2. Есть некоторая программа, скажем LibreOffice (иллюстрирует некоторую сборку-Х), которая установлена на компьютер пользователя (п.1)
3. Пользователю, вдруг пришла в голову мысль запустить LibreOffice, поработать там и закрыть его. И возможно, вообще забыть, что он когда-то был установлен или запущен. А потом запустить его ещё раз, поработать, снова закрыть и так далее.

При этом, как работает LibreOffice, на чём он написан и все прочие параметры - не интересуют пользователя.

Я вижу это так:
1. Запускаем один (или несколько) управляемых потоков
2. Ждём "сигнал"
3. По сигналу (п.2) убиваем потоки (п.1) и забываем, что они когда-то вообще были, до того самого момента, пока они снова нам не понадобятся.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.05.2015, 10:17
Цитата Сообщение от wolfalone Посмотреть сообщение
Не совсем понимаю, как я могу выйти из "чужого" метода по своему критерию?
А если "обернуть" чужой метод в свой?
Цитата Сообщение от wolfalone Посмотреть сообщение
Я вижу это так:
Так я вам про что говорю??? Запустили, подождали, нет сигнала - выход. И так далее. Я про этот "сигнал" (флаг выхода) с самого начала темы говорил.
0
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
04.05.2015, 10:32  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
А если "обернуть" чужой метод в свой?
Предположим, чужой метод выглядит так:
C#
1
2
3
4
5
while (true)
{
    int i = 0;
    i++;
}
Как мы можем "обернуть" его в свой и прервать по условию?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.05.2015, 10:39
Цитата Сообщение от wolfalone Посмотреть сообщение
Предположим, чужой метод выглядит так:
Он так выглядеть не может, поскольку ранее вы сказали, что этот метод выдает вам к-либо информацию.
Цитата Сообщение от wolfalone Посмотреть сообщение
и вот от монитора пришла информация, что сайт "того" (отвалился).
0
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
04.05.2015, 10:47  [ТС]
insite2012, вероятно я не совсем корректно изложил условия задачи. Давайте попробую ещё раз...

Есть две ключевых сущности:
1. Метод, который работает не бог весть как (нам не известно, как он работает и что он вообще делает, в т.ч. он может работать как в примере выше). Загружается этот метод из сторонней сборки.
2. Другой метод, работающий в своём, независимом потоке, который отвечает за установку одного единственного флага или вызов другого метода, который должен убивать потоки, в которых работает метод из п.1.

Если "чужой" метод может завершаться сам по себе, то нет глобального смысла управлять потоком, в котором он работает. Т.к. метод завершится, сделает return; и поток умрёт сам по себе, без моего вмешательства. Соответственно, и вопрос не имел бы особого смысла изначально, при таких условиях.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.05.2015, 10:57
Цитата Сообщение от wolfalone Посмотреть сообщение
Есть две ключевых сущности:
А у меня только один вопрос:
Цитата Сообщение от wolfalone Посмотреть сообщение
Метод, который работает не бог весть как
Этот метод возвращает ч-либо вызывающему коду? Или он "просто работает", сам по себе, не принося для внешнего кода никакой пользы (что вряд ли)?
0
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
04.05.2015, 14:51  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Этот метод возвращает ч-либо вызывающему коду?
Этот метод, для примера, наполняет базу данных. Скачивает страницу, записывает её в БД, скачивает следующую страницу, записывает в БД её... и так до бесконечности.

И тут предположим возникла такая ситуация, что вместо страницы нам попался BluRay-фильм (50Гб), а скорость обмена данными с сервером - 64Кбит/сек. И вот настаёт момент, когда нам нужно прервать процесс загрузки страницы и убить поток, в котом он скачивается, например, по той причине, что если "страница" (в примере - фильм) не скачались за, скажем 5 минут - нужно ликвидировать этот процесс, со всеми потрохами.

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

Добавлено через 3 часа 42 минуты
Давайте я ещё более конкретизирую вопрос. Задача:

Создать 5 потоков, в каждом из которых открывается MessageBox, подождать 10 секунд, уничтожить все эти потоки и MessageBox'ы еже с ними. Не дожидаясь, пока предыдущие 5 потоков что-то родят - создать 5 новых потоков, с другими MessageBox'aми и закрыть их через 30 секунд.

Если это возможно, подскажите пожалуйста, максимально простой пример кода. Спасибо!
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.05.2015, 15:56
Цитата Сообщение от wolfalone Посмотреть сообщение
подскажите пожалуйста, максимально простой пример кода.
Ну задача мне так до конца и не ясна (с учетом того, что условия как-то постепенно меняются), но могу посоветовать поиграть с классом Task.
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
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.Threading;
using System.Threading.Tasks;
 
namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            button1.Click += new EventHandler(button1_Click);
        }
 
        void button1_Click(object sender, EventArgs e) {
            Task[] tasks = {
                              Task.Factory.StartNew(()=>{ MessageBox.Show("I am a Task!");}),
                              Task.Factory.StartNew(()=>{ MessageBox.Show("I am a Task!");}),
                              Task.Factory.StartNew(()=>{ MessageBox.Show("I am a Task!");}),
                              Task.Factory.StartNew(()=>{ MessageBox.Show("I am a Task!");}),
                              Task.Factory.StartNew(()=>{ MessageBox.Show("I am a Task!");})};
            Task.WaitAll(tasks, 10000);
            for (int i = 0; i < 5; i++) {
                Task.Factory.StartNew(() => { MessageBox.Show("I am a Task!"); });
            }
        }
    }
}
0
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
04.05.2015, 16:24  [ТС]
Получилось не совсем то, чего я хотел.

Task.WaitAll не уничтожает потоки, она просто ждёт какое-то время, пока поток не завершится, а потом продолжает выполнения программы дальше, ничего не делая с потоком, который выполняется. Убедиться в этом легко:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void Form1_Load(object sender, EventArgs e)
        {
            Task[] tasks = {                              
                //Запускам поток, который нам будет бесконечно генерировать MessageBox'ы
                Task.Factory.StartNew(()=>{ // <-- поток который нужно полностью ликвидировать, по прошествии 5-и секунд, не зависимо от
                    while (true)
                    {
                        MessageBox.Show("I am a Task!"); //Этот MessageBox будет появляться вечно
                        Thread.Sleep(1000);
                    }                    
                })
            };
 
            Task.WaitAll(tasks, 5000); //Вешаем программу на 5 секунд
            for (int i = 0; i < 3; i++)
            {
                Task.Factory.StartNew(() => { MessageBox.Show("I am a Task 2"); }); //Запускаем новый MessageBox в отдельном потоке
            }
            //При этом, изначально запущенный поток как существовал, так и продолжает существовать и работать
        }
    }
Мне нужно не просто повесть программу, в ожидании, 5-и (или N) секунд, а полностью уничтожить поток их вызывающий. Если я закрою главную форму программу, - следом за ней исчезнут и все вызванные ей потоки и MessageBox'ы, сгенерированные в дочерних потоках, и вообще всё, что "наплодила" программа.

Мне же нужно уничтожить не весь процесс или главное окно, а один конкретный поток, не зависимо от того, что там в нём происходит. И как следствие, уничтожить всех его потомков.
Миниатюры
Прервать несколько потоков  
0
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
04.05.2015, 16:35  [ТС]
C#
1
2
3
4
5
6
Task.Factory.StartNew(()=>{
while (true)
{
    MessageBox.Show("I am a Task!");
}
})
поток вечно создающий MessageBox'ы. Автоматически уничтожается при закрытии главного окна программы. Можно его уничтожить НЕ закрывая главное окно программы? Скажем, подождать 10 секунд и уничтожить.

Добавлено через 1 минуту
*при этом MessageBox может как возвращать что-то, так может и не успеть что-то вернуть. По этому, если в течение, скажем, 10-и секунд, MessageBox ничего не вернул - нужно его уничтожить, вместе с потоком его вызвавшим.
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
04.05.2015, 19:17
C#
1
2
3
4
5
6
7
8
9
Task task = Task.Run(() =>
        {
            while (true)
            {
                MessageBox.Show("I am a Task!");
            }
        });
 
        task.Wait(5000, new CancellationToken(false));
это чтоли?
0
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
06.05.2015, 11:24  [ТС]
Цитата Сообщение от _exp10der_ Посмотреть сообщение
это чтоли?
К сожалению, не помогло...

Давайте попробуем так. Есть вот такой код:

C#
1
2
3
4
5
6
7
8
9
10
public static class Class1
{
    public static void DoWork(string url)
    {
        while(true)
        {
            //Do work here
        }
    }
}
Мне нужно, в новом потоке (что бы не вешать основной), выполнить:
C#
1
DoWork("yandex.ru");
Подождать 10 секунд, и уничтожить этот поток, вместе с выполняющимся в нём кодом и всеми прочими потрахами. Сделать так, как буд-то его и не было никогда.

Если говорить ещё точнее, мне нужно запустить 5-10 таких потоков, в каждом из которых будет выполняться DoWork со своими параметрами, подождать некоторое время, остановить выполнение всех ранее запущенных потоков, не дожидаясь пока они что-то вернут или предпримут, а потом запустить новые 5-10 штук и так далее.

Если ещё точнее, то каждый поток запускается на 1 минуту, если за это время он ничего не вернул, - то должен быть безусловно уничтожен, не зависимо от его пожеланий, т.к. операция внутри потока может просто "зависнуть" на неопределённое время. Если поток возвращает какое-то значение сам, не зависая, тут проблем нет. Есть масса способов "дождаться" выполнения потока, например с помощью async/await... Но бывает такое, что поток просто "завис", и должен быть полностью аннигилирован, т.к. есть вероятность, что дождаться момента, когда он что-то вернёт - невозможно.

Добавлено через 4 минуты
P.S. Первый блок кода - приведён исключительно для примера. Я не знаю, что будет в реальном коде, т.к. "реальный" код загружается из внешней сборки, и какая именно там логика зашита - я не знаю. Но, какая бы там не была логика - у неё есть строгий лимит на выполнение операции, и если код не успел завершиться за это время - значит, он должен быть выгружен/остановлен/уничтожен/аннигилирован.

Добавлено через 4 минуты
Другой вариант развития событий - потоки должны выполняться неопределённое время, то есть до наступления какого-то события. Как только наступило событие Х, мы должны прервать все ранее выполняющиеся потоки (полностью уничтожить их, в т.ч. и остановить выполняющийся в них код) и запустить новую партию потоков.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.05.2015, 12:54
Цитата Сообщение от wolfalone Посмотреть сообщение
Я не знаю, что будет в реальном коде, т.к. "реальный" код загружается из внешней сборки, и какая именно там логика зашита - я не знаю. Но, какая бы там не была логика - у неё есть строгий лимит на выполнение операции, и если код не успел завершиться за это время - значит, он должен быть выгружен/остановлен/уничтожен/аннигилирован.
Если внешний код не предусматривает отмены, то запускайте его в отдельном процессе и в случае чего убивайте этот процесс — таким образом внешний код не нагадит в памяти вашего приложения.
0
В экстазе
 Аватар для wolfalone
168 / 152 / 38
Регистрация: 05.08.2012
Сообщений: 767
Записей в блоге: 3
06.05.2015, 20:31  [ТС]
kolorotur, в таком решении, для меня есть несколько моментов, которые мне не ясны:

1. Можно ли запустить .dll (сбоку) в отдельном процессе?
2. В случае, если от "процесса" нужно будет получать некоторые данные, или передавать в него, какие-то параметры - как это сделать, теоретически?

Дело в том, что в данный момент, необходимый код, предоставляется исключительно в виде .dll (сборок) и доступен только удалённо (по сети).

P.S. Возможно, всё-таки существует некоторый способ именно "уничтожения" потоков? Мне всегда казалось, что парадигма C# предусматривает нечто подобное... Уничтожил поток, а сборщик мусора приберётся и добьёт, эм... недобитые данные.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.05.2015, 20:31
Помогаю со студенческими работами здесь

Скачать файл в несколько потоков
Подскажите, пожалуйста, где ошибся в своих размышлениях насчет многопоточного скачивания: 1) получаем размер файла, разбиваем его на...

Создать и запустить одновременно несколько потоков
Всем привет) Необходимо создать несколько потоков и запустить их одновременно (без помощи циклов). Как это сделать? Помогите...

BackgroundWorker, несколько потоков и процент выполнения
Здравствуйте, На форме есть кнопка и label (из примера...

Как запустить поочередно несколько потоков?
Изучаю многопоточность. Столкнулся со следующей проблемой. Имеется такой вот гипотетический код: public class WORK{ private...

Сортировка массива используя несколько потоков
Здравствуйте. У меня есть, например, в списке 10 элементов - массивов строк, и я хочу отсортировать их в потоках, но потоков, например, 4....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru