void* fileCopyThread(void* arg){ QPair<QString, QString>* p = (QPair<QString, QString>*)arg; QFile::copy(p->first, p->second); return NULL;}void* dirThread(void* arg){ QPair<QDir, QDir>* temp = (QPair<QDir, QDir>*)arg; QFileInfoList list = (*temp).first.entryInfoList(); for(QFileInfoList::iterator tmp = list.begin();tmp<list.end();tmp++) { if(((*tmp).fileName() == ".") || ((*tmp).fileName() == "..") || ((*tmp).isSymLink()))continue; if((*tmp).isFile() && (*tmp).exists()) { //Тут файловый поток QPair<QString, QString> f; f.first = (*tmp).absoluteFilePath(); f.second = (*temp).second.absolutePath() + "/" + (*tmp).fileName(); pthread_t tttt; pthread_create(&tttt, NULL, fileCopyThread, (void*)(&f)); pthread_join(tttt, NULL); //Если ждать - всё ок! //fileCopyThread((void*)(&f)); //Это для проверки в "однопоточном" режиме continue; } if((*tmp).isDir()) { //Вот тут рекурсию (*temp).second.mkdir((*tmp).fileName()); QPair<QDir, QDir> t; t.first = QDir((*tmp).filePath()); t.second = QDir((*temp).second.path() + "/" + (*tmp).fileName()); pthread_t tmpt; pthread_create(&tmpt, NULL, dirThread, (void*)(&t)); pthread_join(tmpt, NULL); //Ждём //dirThread((void*)&t); //Однопоток continue; } } return NULL;}int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8")); if(argc<2) { qDebug()<<"Беда с аргументами"; return 0; } QPair<QDir, QDir> p; p.first = QDir(argv[1]); p.second = QDir(argv[2]); pthread_t thr1; pthread_create(&thr1, NULL, dirThread, (void*)(&p)); pthread_join(thr1, NULL); return 0;}