remove msleep, clean PIConditionVariable, rewrite pipipelinethread, etc...

This commit is contained in:
Andrey
2021-10-29 16:52:03 +03:00
parent 21e03fc8cb
commit 6e5a5a6ade
16 changed files with 203 additions and 213 deletions

161
main.cpp
View File

@@ -1,123 +1,50 @@
#include "pip.h"
class PIThreadNotifier {
public:
PIThreadNotifier(): cnt(0) {}
void wait() {
m.lock();
while (cnt == 0) v.wait(m);
cnt--;
m.unlock();
}
void notifyOnce() {
m.lock();
cnt++;
v.notifyAll();
m.unlock();
}
private:
ullong cnt;
PIMutex m;
PIConditionVariable v;
};
int main(int argc, char * argv[]) {
PIVector<int> data(10, [](int i)->int{return i;});
piCout << data;
PIThreadPoolLoop pool;
pool.setFunction([&](int i){
data[i] = data[i] + 10;
});
pool.exec(0, data.size());
piCout << data;
return 0;
PIVector<int> x(20, [](int i) {return i;});
piCout << x;
piCout << x.any([](int v) {return v == 10;});
piCout << x.every([](int v) {return v > 0;});
piCout << x.etries([](int v) {return v % 5 == 0;});
piCout << x.indexWhere([](int v) {return v % 8 == 0;});
piCout << x.indexOf(4, -1);
piCout << x.lastIndexOf(1, 0);
piCout << x.lastIndexWhere([](int v) {return v % 8 == 0;});
PIVector<double> x2 = x.map<double>([](int v) {return v / 10.0;});
piCout << x2;
piCout << x.reduce<PIString>([](int v, PIString s){return s + PIString::fromNumber(v);});
piCout << x.removeWhere([](int v){return v % 2 == 0;});
piCout << x.getRange(8, 1);
piCout << x.getRange(8, 100);
piCout << "=====================";
PIDeque<int> y(20, [](int i) {return i;});
piCout << y;
piCout << y.any([](int v) {return v == 10;});
piCout << y.every([](int v) {return v > 0;});
piCout << y.etries([](int v) {return v % 5 == 0;});
piCout << y.indexWhere([](int v) {return v % 8 == 0;});
piCout << y.indexOf(4, -1);
piCout << y.lastIndexOf(1, 0);
piCout << y.lastIndexWhere([](int v) {return v % 8 == 0;});
PIDeque<double> y2 = y.map<double>([](int v) {return v / 10.0;});
piCout << y2;
piCout << y.reduce<PIString>([](int v, PIString s){return s + PIString::fromNumber(v);});
piCout << y.removeWhere([](int v){return v % 2 == 0;});
piCout << y.getRange(8, 1);
piCout << y.getRange(8, 100);
return 0; // TODO:
PIByteArray rnd;
rnd.resize(1024*1024, 'x');
PICLI cli(argc, argv);
PITimer tm;
cli.addArgument("connect", true);
cli.addArgument("name", true);
PICloudClient c("127.0.0.1:10101");
// c.setReopenEnabled(true);
PICloudServer s("127.0.0.1:10101");
PIVector<PICloudServer::Client *> clients;
CONNECTL(&tm, tickEvent, ([&](void *, int){
if (c.isConnected()) {
PIString str = "ping";
piCout << "[Client] send:" << str;
c.write(str.toByteArray());
}
if (s.isRunning()) {
for (auto cl : clients) {
if (cl->isOpened()) {
PIString str = "ping_S";
piCout << "[Server] send to" << cl << ":" << str;
cl->write(str.toByteArray());
}
}
}
}));
CONNECTL(&c, threadedReadEvent, ([&](uchar * readed, int size){
PIByteArray ba(readed, size);
if (size < 1024) {
PIString str = PIString(ba);
piCout << "[Client] data:" << str;
if (str == "ping_S") c.write(PIString("pong_S").toByteArray());
} else piCout << "[Client] blob:" << size;
}));
CONNECTL(&c, connected, ([](){piCout << "connected";}));
CONNECTL(&c, disconnected, ([](){piCout << "disconnected";}));
CONNECTL(&s, newConnection, ([&](PICloudServer::Client * cl){
piCout << "[Server] new client:" << cl;
clients << cl;
CONNECTL(cl, threadedReadEvent, ([&c, &s, cl, &rnd](uchar * readed, int size){
PIByteArray ba(readed, size);
PIString str = PIString(ba);
piCout << "[Server] data from" << cl << ":" << str;
if (str == "ping") {
cl->write(PIString("pong").toByteArray());
cl->write(rnd);
}
}));
CONNECTL(cl, closed, ([&clients, cl](){
cl->stop();
clients.removeAll(cl);
cl->deleteLater();
}));
cl->startThreadedRead();
}));
if (cli.hasArgument("name")) s.setServerName(cli.argumentValue("name"));
if (cli.hasArgument("connect")) {
c.setServerName(cli.argumentValue("connect"));
c.startThreadedRead();
} else {
s.startThreadedRead();
}
tm.start(1000);
PIKbdListener ls;
ls.enableExitCapture(PIKbdListener::F10);
ls.start();
WAIT_FOR_EXIT
PIThreadNotifier n;
int cnt1 = 0;
int cnt2 = 0;
int cnt3 = 0;
PIThread t1([&n, &cnt1](){n.wait(); cnt1++; piMSleep(1);}, true);
PIThread t2([&n, &cnt2](){n.wait(); cnt2++; piMSleep(2);}, true);
piCout << "created";
piMSleep(10);
piCout << "unlock" << cnt1 << cnt2 << cnt3;
n.notifyOnce(); cnt3++;
piMSleep(10);
piCout << "unlock" << cnt1 << cnt2 << cnt3;
n.notifyOnce(); cnt3++;
piMSleep(10);
piCout << "run" << cnt1 << cnt2 << cnt3;
PIThread t3([&n, &cnt3](){n.notifyOnce(); cnt3++; piMSleep(1);}, true);
piMSleep(20);
t3.stop();
piMSleep(100);
piCout << "exit" << cnt1 << cnt2 << cnt3;
// m.unlock();
// piMSleep(10);
return 0;
}