подскажите как правильно записать

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by good_man, 23 Aug 2010.

  1. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    ребят, сорри за тему. туплю что то.

    в общем как сделать это:

    вместо такой записи

    ChekThread1*thr1=new ChekThread1(true);

    нужно сделать что то типа того:

    i=1;
    ChekThread*thr=new ChekThread(true);

    как правильно записать? заранее благодарю. пытаюсь учиться работать с несколькими потоками. искал в этом разделе подобную тему но ее выпилили вроде.
     
  2. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    PHP:
    ChekThread1thr1[100];
    for(
    int i 0100; ++i)
         
    thr1[i] = new ChekThread1(true);
     
  3. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    M_script большое спасибо! в очередной раз очень помогли! по вашим примерам я много чего освоил. теперь вот и многопоточность буду тестить :) рекпект!
     
  4. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    не подскажите еще как сюда >[100]<; поставить бы цифры тоже из переменной?

    UPD:

    хотя не нужно совсем ) запилил int thread; extern thread; и все гуд )
     
    #4 good_man, 23 Aug 2010
    Last edited: 23 Aug 2010
  5. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Там только константа. Пиши максимальное число потоков, которые могут быть в твоей программе.
     
    #5 M_script, 23 Aug 2010
    Last edited: 23 Aug 2010
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Бред, можно же написать так (привожу на примере DWORD'ов, но вместо них что угодно подставить можно):
    PHP:
    size_t a 100//заранее неизвестно

    DWORD *arr = new DWORD[a]; //создаем массив
    for(size_t num 0num anum++)
        
    arr[num] = num//заполняем массив числами

    for(size_t num 0num anum++) //выводим массив
        
    printf("%u\r\n",arr[num]);

    delete[] arr//удаляем массив
     
    1 person likes this.
  7. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    GRRRL Power, не нужно путать массив указателей и указатель на массив ;)

    А если это "что угодно" - класс TThread (о котором и идет речь в теме), и подходящего конструктора просто нет, что делать?
     
    #7 M_script, 23 Aug 2010
    Last edited: 23 Aug 2010
  8. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    Прошу прощения, что влез в чужой разговор, но, блин, M_script, ты в программировании вообще шаришь?

    PHP:

    // PTThead есть алиас для TThread*


    size_t a 100//заранее неизвестно 

    PTThread *arr = new PTThread[a];
    for(
    size_t i 0a; ++i
        
    arr[i] = new TThread(itrue"whatever"); 

    for(
    size_t i0a; ++i)
        
    arr[i]->Join();

    for(
    size_t i0a; ++i)
        
    delete arr[i];

    delete[] arr;
    Вот до этого так трудно додуматься? Извини, но это очевидно.
     
    #8 Bers, 23 Aug 2010
    Last edited: 23 Aug 2010
    1 person likes this.
  9. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Мда, M_script...
    Привожу пример на классе БЕЗ конструктора по умолчанию:

    PHP:
    #include "stdio.h"
    #include "windows.h"

    typedef
    class _ololo
    {
    public:
        
    _ololo(int num)
            :
    number(num)
        {}

        
    int get_number()
        {
            return 
    number;
        }

    private:
        
    _ololo();
        
    int number;
    }
    shkololo, *Pshkololo;

    int main(int argccharargv[])
    {
        
    size_t a 10;

        
    Pshkololo *arr = new Pshkololo[a];

        for(
    size_t i 0ai++) 
            
    arr[i] = new shkololo(i);

        for(
    size_t i 0ai++) 
            
    printf("%u\r\n"arr[i]->get_number());

        for(
    size_t i 0ai++) 
            
    delete arr[i];

        
    delete[] arr;

        
    system("PAUSE");
        return 
    0;
    }
    Bers тоже правильно сказал.
     
  10. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    Эээ... Я даже не знаю, что тут можно ответить...
    По-моему, в моем сообщении был точный ответ на вопрос ТС. Ему же надо было работать с несколькими указателями на некий класс (CheckThread или как его там), так? Я написал код, который как раз работу с несколькими указателями и выполняет. Поможет ли ему мой совет? Если он страдает дислексией - то нет (но тогда ему вообще советы в письменном виде не помогут). Если же он в состоянии прочесть ответ на свой же вопрос - думаю, совет ему будет полезен (по крайней мере не навредит).
     
  11. good_man

    good_man New Member

    Joined:
    24 May 2010
    Messages:
    112
    Likes Received:
    3
    Reputations:
    -2
    О_О сколько инфы ) впринципе оч полезно, но я просто хотел чтоб юзер мог указать кол-во потоков. усложнять нелюблю код, всегда стараюсь написать проще. потому как я не профи, учусь по гуглу. поэтому просто напросто сделал так:

    i=0;
    ChekThread1* thr[5];
    while (i<thread)
    {
    thr = new ChekThread1(true);
    thr->Resume();
    IdHTTP++;
    i++;
    ::Sleep(1000);
    }


    if(TrackBar1->Position==1)
    {
    thread=2;
    }
    if(TrackBar1->Position==2)
    {
    thread=3;
    }
    if(TrackBar1->Position==3)
    {
    thread=4;
    }
    if(TrackBar1->Position==4)
    {
    thread=5;
    }
     
  12. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Я имел ввиду конкретно класс TThread, чтобы взять код отсюда, вставить его в проект и все заработало.

    оффтоп
    Смысл такой же, как и в смене временного удостоверения личности на утерянный когда-то паспорт.
    Уже много раз отвечал на этот вопрос:
    Создал новый аккаунт, потому что забыл пароль от старого, а почтового сервиса, на который регался этот акк больше не существует, поэтому не мог восстановить.
    В июне увидел https://forum.antichat.ru/thread213333.html, пункт 2, поэтому и восстановил.



    p.s.: все равно считаю, что конкретно в этом случае лучше использовать массив указателей заранее известной длины.



    good_man, то же самое:
    PHP:
    ChekThread1thr[5];
    for(
    int i 0TrackBar1->Position; ++i)
    {
        
    thr[i] = new ChekThread1(false);
        
    IdHTTP++;
        
    Sleep(1000);
    }
     
    #12 M_script, 23 Aug 2010
    Last edited: 23 Aug 2010
  13. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Я хоть борландом и не увлекаюсь, но попробую вам помочь:
    PHP:
    size_t a TrackBar1->Position//получили число потоков

    typedef ChekThread1 *PChekThread1;

    PChekThread1 *thr = new PChekThread1[a]; //массив из нужного числа потоков, а не 100500 заранее, как предлагал мскрипт

    for(size_t i 0ai++)
    {
      
    thr[i] = new ChekThread1(true);
      
    thr[i]->Resume();
      
    //еще какой-то код инициализации...
        
    IdHTTP++;
        
    Sleep(1000);
    }

    ..........

    //в процедуре деинициализации, которая очищает память после работы, напишите так:

    for(size_t i0a; ++i//a - число потоков
        
    delete thr[i];

    delete[] thr;
    Учитесь сразу программировать как надо.
    А вопрос к M_script - представьте, что вместо потоков вам надо создать неизвестное число объектов некоторого класса, и число это - от 1 до 100000. Будете делать статический массив из 100000 элементов?
     
    1 person likes this.
  14. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Буду делать так, как будет наиболее оптимально для решения поставленной задачи.
    В случае с TThread я всегда использую статический массив, потому что это удобнее, а так как количество элементов небольшое, затраты памяти не критичны.
    Вы мне экзамен по программированию решили устроить? Зачетку готовить?
     
  15. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Ну вообще говоря лучше два, или даже три примера.
    Используем статику если известен размер(до компиляции, ну или в процессе компиляции). Круто выигрываем в производительности. (example M_script)
    Используем динамику если неизвестен размер и мы его точно узнаем в процессе выполнения. (example GRRRL Power)
    Используем хэш(или лист) когда неизвестен размер и мы его не узнаем(ну или он будет меняться).
     
    #15 Irdis, 24 Aug 2010
    Last edited: 25 Aug 2010