Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Тут ограничения на размер, не более 50 кб, удаляй всё ненужное и большое.
     
  2. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    твой проект у меня тоже неправильно работает.
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Даже когда скомпиленный запускаешь?
     
  4. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    да. вообще каждый раз по разному выводит.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А у меня твой, даже скомпиленный, нормально работает. У тебя что за процессор?
     
  6. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    пентиум 4. а что, от него тоже это зависит?)
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В принципе зависит, многоядерные немного по-другому работают. На самом деле потоки могут выполняться немного не в том порядке в каком их запускали. Попробуй после CreateThread поставить sleep(10); Даже в процессе работы одного потока, возможно переключение на другой.
     
  8. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    поставила прям после открытия:
    while (j<3)
    {
    char* p = (char*)malloc(10);
    while (pBuffer!='\n')
    {
    Name [k]=pBuffer;
    i++;
    k++;
    }
    Name [k]='\n';
    Name [++k]='\0';
    memcpy(p, Name, 10);
    //InitializeCriticalSection (&gs);
    h[j]=CreateThread (NULL,0,Thread1,p,0,&id1);
    sleep(10);
    k=0;
    j++;
    i++;
    }
    выдает ошибку:
    error C3861: 'sleep': identifier not found, even with argument-dependent lookup
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    То есть Sleep(10); Если не поможет, то поставить число побольше.
    Ещё в свойствах проекта, не помешает включить многопоточный рантайм.
    Properties -> С/C++ -> Code Generation -> Runtime library. Поставить Multi-Threaded.
     
  10. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    мне как раз таки и надо, чтобы они параллельно все это делали. то, что я сейчас делаю - это только маленькая часть. вообще задача заключается в том, чтобы потоки по этой строке,которую мы им передали, нашли в базе данных access таблицу с этим именем, и поток же должен эту таблицу выгрузить в текстовый файл. вот. и надо, чтобы все таблицы выгружались параллельно. так что потоуи нужны. только вот как сделать, чтоб они нормально работали?
     
  11. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    ой))) работает!!!!) спасибо тебе большое!!!!!
    только вот если я буду расширять функцию потока,потоки нормально будут работать???
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Я же говорю, что порядок их запуска не гарантируется, а уж тем более порядок вызова printf. Так как Sleep помогло? Вообще на однопроцессорной/одноядерной машине, параллельность иллюзия. Если важен порядок вызова, то необходимо дополнительно синхронизировать.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Если используешь в каждом потоке свои обособленные данные (например автоматические переменные), то всё будет нормально, если нужен одновременный доступ к одним и тем же данным из разных потоков, то возможно придётся синхронизировать. Иначе произойдёт как ранее, одни чего-то пишут, другие в это время пишут туда же, третьи читают оттуда наполовину изменённые данные. Вообщем бардак полнейший.
     
  14. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    если использовать вот такую функцию:
    DWORD WINAPI Thread1 (PVOID pvParam)
    {
    //EnterCriticalSection (&gs);
    int i=0;
    int j=4;
    char c[20]="C:\\";
    //char d[5];
    char* tname = (char*) pvParam;
    printf ("%s\n", tname);

    while (tname!=13)
    {
    i++;
    }
    tname ='.';
    tname [++i]='t';
    tname [++i]='x';
    tname [++i]='t';
    tname [++i]=0;
    strcat (c,tname);
    printf ("%s\n", c);
    int txt_length=lstrlen(c);
    DWORD written;
    HANDLE f;
    f=CreateFile (c, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    WriteFile(f, c, txt_length+1, &written, NULL);
    free(pvParam);
    //LeaveCriticalSection (&gs);
    return 0;
    }
    то free(pvParam); только там, где он стоит можно использовать, или перенести куда можно?
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Там где заканчиваешь использовать tname, там и можно грохнуть, думаю после strcat (c,tname); вполне можно это сделать. Да и не забывай освобождать файлы после их использования - CloseHandle. Не забывай, что потоки могут прерываться другими потоками, отсюда и необходима осторожность с общими данными.
     
  16. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    да я вроде освобождаю. поставила free(pvParam);туда, куда ты сказал. работает! спасибо большое!!)
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    JangaMa
    Да не зачто, всегда рад помочь. )
     
  18. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    где можно найти, как использовать ADO, чтобы обратиться к базе данных access?
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    JangaMa
    ? где можно найти, как использовать ADO
    msdn: ADO Programmer's Guide

    > обратиться к базе данных access
    На псевдоязыке
    Код (Text):
    1. Connection = CreateObject("ADODB.Connection")
    2. Connection.ConnectionString  = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" + MyAccessFileName
    3. Connection.Open()
    4. adOpenDynamic = 2
    5. adLockOptimistic = 3
    6. rs = CreateObject("ADODB.Recordset")
    7. rs.Open(MyTableName, Connection, adOpenDynamic, adLockOptimistic)
    8. rs.Fields(MyFiledName).Value = MyValue
    9. rs.Close()
    10. Connection.Close()
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ссылок в инете на это очень много, забей в поиск строку - "ADO C++"
    Вот например - http://www.codersource.net/mfc_ado_select.html
    Там только провайдера нужно будет поменять, да Data Source на локальный путь к базе.